[英]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.