繁体   English   中英

EF Code First 4.1:“多重继承”(是)问题

[英]EF Code First 4.1: “Multiple Inheritence” (Is A) Question

我正在尝试使用EF 4.1 Code First建立一种“多重继承”关系模型。 这是我要尝试的一个示例。

假设我正在尝试使用“ User”对象为用户与应用程序交互的方式建模。 这是基类,用于描述当前用户没有特别做任何事情(例如访问首页)时的状态。 它可能看起来像这样:

public class User
{
    public Guid ID { get; set; }    // Just use the forms authentication user ID
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

现在,如果我想创建同一用户的代表,但在网站的不同部分,例如,作为购物者,它可能看起来像这样:

public class Shopper : User
{
    public virtual ICollection<Orders> Orders { get; set; }
}

等等等等。 当我插入具有预先存在的User条目的Shopper时,它会引发异常,因为PK已在User表中获取。

有什么方法可以使用EF Code First对这种(IsA)关系进行建模? 还是我会被这样的事情困扰?

public class Shopper
{
    public Guid UserID { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Order> Orders { get; set; }

    public string FirstName
    {
        get { return User.FirstName; }
        set { User.FirstName = value; }
    }

    // yada, yada, yada...
}

我想坚持使用Code First,并在我的DbContext中对关系进行建模,但是我不知道该怎么做。 谢谢!

编辑:

所以,我正在尝试做这样的事情:

public void SomeMethod ()
{
    var UserID = Guid.NewGuid ();
    var MyUser = new User () { ID = UserID };
    SaveUserToDatabase (MyUser);

    var ShopperRepresentation = GetUserAsShopper (UserID);
    //  Do stuff.
}

我猜,基本上就像使用面向对象的角色一样。 我想对该用户的每个表示使用相同的PK,但将其所有基本信息存储在一个名为User的基类中。 我当然知道如果我编写自己的SQL是有可能的,但是我想看看EF Code First是否也可以做到这一点。

是的,您可以按照前两个代码示例中的描述进行操作。

我认为您只需要定义一个映射,除了正确设置类之外,还需要在DataContext OnModelCreating函数中进行此映射。 如何执行取决于所使用的映射方案。 我在最近的项目中选择了Table-Per-Type(TPT),所以我有这样的事情:

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

让我知道这是否对您不起作用,我会尽力而为。

编辑:

看到您在下面的澄清后,我想不出一种解决方法。 您必须将每个对象分开存储(让EF将购物者视为购物者,而不是购物者和用户),即使它们共享公用数据。 这可能导致数据不匹配(例如,如果Shopper更新了其姓氏,但用户未更新)。 我认为您最好使用以下方法:

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; }
}

然后当您需要将User视为Shopper时,只需访问ShopperInfo(如果没有,则创建它)。 EF可以为您正确设置该设置。

尽管如果您要拥有许多类型的用户,则可能会很麻烦。 不过只是一个建议-我认为它更干净。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM