Frage

In meinem Datenmodell mir eine ziemlich häufige Trennung zwischen meinen Objekten / Tabellen / Daten:

  • „Transactional“ Entitäten, die die Arbeit darstellen, die durch das System getan wird. Diese Einheiten werden vom System erstellt und sind nur wichtig, in bestimmten Kontexten. Sie werden im laufenden Betrieb regelmäßig erstellt. (Abgesehen: Gibt es einen richtigen Namen für diese Art von Einheit)
  • „Data Dictionary“ Entitäten, die gemeinsame Eigenschaften der Transaktions Entitäten darstellen. Diese sind definiert unregelmäßig (meist zu Beginn des Projektes) und haben einen viel statischen Lebenszyklus. Sie werden in der Regel von mir erstellt.

So, zum Beispiel, ich könnte eine Benutzer (Transaktions) Einheit und eine Usertype (Data Dictionary) Einheit.

Ich möchte (hart) Code Verweise auf Instanzen der Data Dictionary Einheiten in meinen Code. Das gibt mir die Möglichkeit, Business-Logik mit einer einfach zu verstehende Sprache zu codieren. (So, zum Beispiel, könnte ich eine Usertype von „Plain“ und eine Usertype von „Admin“ und dann einer Regel, die sagt: „Zugriff erlaubt nur, wenn der Usertype des Nutzers entspricht Admin“).

Ich bin mit LINQ-to-Entities als meine Datenzugriffstechnologie / ORM. Um die Data Dictionary Referenzen zu implementieren, ich bin Speicherung EntityKeys. Mein Verständnis ist, dass sie aus dem Objektkontext losgelöst sind und so sind für diesen Zweck geeignet. (Da sie nicht Entitätsstatus enthalten, auch ich habe keine Sorgen darüber Zustand versauernd.)

Dies ist jedoch gibt mir Probleme, wenn ich versuche, eine neue Transaktions Entität mit einem DD-EntityKey Verweise hinzuzufügen. Fortsetzung mein Beispiel, ich tue dies:

UserEntities userEntities = new UserEntitites()
User user = new User()
user.UserType = new UserType()
user.UserType.EntityKey = adminEntityKey
userEntities.AddToUser(user)

... und das gibt mir die folgende Fehlermeldung:

  

System.InvalidOperationException: Das Objekt kann nicht auf die Object hinzugefügt werden, da es bereits eine EntityKey hat. Verwenden Sie ObjectContext.Attach um ein Objekt zu befestigen, die einen vorhandenen Schlüssel hat.

Wenn ich versuche, userEntities.Attach (Benutzer) anstelle von AddToUser zu nennen, bekomme ich diese:

  

System.InvalidOperationException:. Ein Objekt mit einem Null-EntityKey Wert kann nicht auf einen Objektkontext angebracht werden

Diese beiden Fehler machen Sinn, da die Mischung von neuen und bereits existierenden Entitäten, die ich tue. Was ich nicht sicher bin, ist, wie dieses Problem zu erhalten. Gibt es irgendeine Weise, die ich Verweise auf DD-Einheiten und ordnen sie neu angehängten Objekte abgelöst haben, können Sie mich, ohne dass die gesamte DD-Entitätsstatus laden?

War es hilfreich?

Lösung

werde ich versuchen zu erklären, warum sind Sie diese Ausnahmen bekommen:

  

System.InvalidOperationException: Das Objekt kann nicht auf die Object hinzugefügt werden, da es bereits eine EntityKey hat. Verwenden Sie ObjectContext.Attach um ein Objekt zu befestigen, die einen vorhandenen Schlüssel hat.

New User und Usertype Einheiten geschaffen werden. Die EntityKey auf Usertype gesetzt wurde, aber wenn man es zu userEntities.Add () übergeben EF versucht, sie Status ZUSÄTZLICH zu setzen. Da ein Usertype EntityKey EF hat realisiert etwas falsch ist und wirft Ausnahme.

  

System.InvalidOperationException:. Ein Objekt mit einem Null-EntityKey Wert kann nicht auf einen Objektkontext angebracht werden

In dieser Ausnahme ist alles ok mit Usertype, aber die Ausnahme, weil Benutzer Einheit ausgelöst wird -. Es keine EntityKey hat und daher nicht angebracht werden kann

Dies ist, wie ich dieses Problem lösen würde (wenn, wie Sie sagen, Hardcoding von Data Dictionary Referenzen ist ok):

Auf Usertype Entität würde ich statische Referenzen erstellen ids auf Benutzertyp:

public partial class UserType
    {
        public const int AdminUserTypeID = 1;
        public const int PlainUserTypeID = 2;
    }  

Ein User-Entität würde es extender Eigenschaft sein für einen leichteren Zugang zum Usertype Fremdschlüssel:

public partial class User
{
    public int? UserTypeID
    {
        set
        {
           UserTypeReference.EntityKey = new EntityKey("UserEntities.UserType", "UserTypeID", value);
        }
        get
        {
            if (UserTypeReference.EntityKey == null)
                return null;

            if (UserTypeReference.EntityKey.EntityKeyValues.Count() > 0)
                return (int)UserTypeReference.EntityKey.EntityKeyValues[0].Value;
            else
                return null;
        }
    }
}

Schließlich ist der Anwendungsfall für neue Benutzer zu schaffen, wie dies aussehen würde:

using(UserEntities userEntities = new UserEntitites())
{
    User user = new User();
    user.UserTypeID = UserType.AdminUserTypeID;
    userEntities.AddToUser(user);
    userEntities.SaveChanges()
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top