Frage

Ich versuche zuerst eine Art "Multiple Inheritence" mit dem EF 4.1-Code zu modellieren. Hier ist ein Beispiel, was ich versuche, zu tun.

sagen wir, ich versuche, so zu modellieren, wie ein Benutzer mit meiner Anwendung mit einem "Benutzer-Objekt interagiert. Dadurch wird die Basisklasse verwendet, um den aktuellen Benutzer zu beschreiben, wenn sie insbesondere nichts tun (z. B. Besuch der Homepage). Es kann so aussehen: generasacodicetagpre.

Jetzt, wenn ich eine Darstellung desselben Benutzers erstellen möchte, aber in einem anderen Teil der Site, sagen Sie, wie ein Käufer, kann es so aussehen: generasacodicetagpre.

und so weiter und so weiter. Wenn ich einen Käufer einfügen kann, der einen vorbestehenden Benutzereintrag aufweist, wirft er eine Ausnahme aus, da die PK bereits in der Benutzertabelle aufgenommen wird.

Gibt es eine Möglichkeit, diese (ISA) -Binome mit dem EF-Code zuerst zu modellieren? Oder werde ich mit so etwas stecken bleiben? generasacodicetagpre.

Ich möchte zuerst mit dem Code bleiben und die Beziehungen in meinem dbcontext modellieren, aber ich kann nicht ganz herausfinden, wie er so etwas tut. Danke!

edit:

Also versuche ich, so etwas zu tun: generasacodicetagpre.

Grundsätzlich wie unter Verwendung objektorientierter Rollen, denke ich. Ich möchte für jeden Anwender des Benutzers dieselbe PK verwenden, sondern alle grundlegenden Informationen in einer Basisklasse namens Benutzer speichern. Ich weiß, dass dies möglich ist, wenn ich meine eigene SQL schreibe, natürlich, aber ich möchte sehen, ob EF-Code es zuerst auch tun kann.

War es hilfreich?

Lösung

Yes, you can do it the way you describe in your first two code examples.

I think you just need to define a mapping, which you'll want to do in your OnModelCreating function of your DataContext in addition to having your classes set up right. How you do it depends on what mapping scheme you're using. I went for Table-Per-Type (TPT) in my most recent project, so I had something like this:

modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Shopper>().ToTable("Shoppers");
modelBuilder.Entity<OtherUser>().ToTable("OtherUsers");

Let me know if that doesn't work for you and I'll see what I can do.

Edit:

Having seen your clarification below, I can't think of a way to do that. You'd have to keep each objects stored separately (having EF treat a Shopper as just a Shopper, not a Shopper and a User), even though they share common data. That could lead to data mismatches (if, say, Shopper got its LastName updated but User didn't). I think you might be better off going with something like:

public class User
{
    public virtual Guid ID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ShopperInfo { get; set; }
}

public class ShopperInfo
{
    public virtual ICollection<Order> Orders { get; set; }
}

and then when you need to treat User as a Shopper, you just access the ShopperInfo (and if its not there, you create it). EF will be able to properly set that up for you no problem.

Though if you're going to have a lot of types of users, that might get cumbersome. Just a suggestion though - I think its a bit cleaner.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top