C# EF代码前4.1:“参考;“多重继承”;这是一个问题

C# EF代码前4.1:“参考;“多重继承”;这是一个问题,c#,ef-code-first,oop,object-oriented-database,C#,Ef Code First,Oop,Object Oriented Database,首先,我试图用EF4.1代码建立一种“多重继承”关系的模型。下面是我正在尝试做的一个例子 假设我正在尝试建模用户使用“用户”对象与我的应用程序交互的方式。这是基类,用于描述当前用户没有做任何特别的事情(例如访问主页)时的情况。可能是这样的: public class User { public Guid ID { get; set; } // Just use the forms authentication user ID public string FirstName

首先,我试图用EF4.1代码建立一种“多重继承”关系的模型。下面是我正在尝试做的一个例子

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

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; }
}
public void SomeMethod ()
{
    var UserID = Guid.NewGuid ();
    var MyUser = new User () { ID = UserID };
    SaveUserToDatabase (MyUser);

    var ShopperRepresentation = GetUserAsShopper (UserID);
    //  Do stuff.
}
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Shopper>().ToTable("Shoppers");
modelBuilder.Entity<OtherUser>().ToTable("OtherUsers");
现在,如果我想在站点的不同部分创建同一用户的表示,例如,作为购物者,它可能如下所示:

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; }
}
public void SomeMethod ()
{
    var UserID = Guid.NewGuid ();
    var MyUser = new User () { ID = UserID };
    SaveUserToDatabase (MyUser);

    var ShopperRepresentation = GetUserAsShopper (UserID);
    //  Do stuff.
}
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Shopper>().ToTable("Shoppers");
modelBuilder.Entity<OtherUser>().ToTable("OtherUsers");

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

是的,您可以按照前两个代码示例中描述的方式来完成

我认为您只需要定义一个映射,除了正确设置类之外,还需要在
DataContext
OnModelCreating
函数中定义映射。如何实现这一点取决于所使用的映射方案。在我最近的项目中,我选择了每种类型的表(TPT),所以我有这样的想法:

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; }
}
public void SomeMethod ()
{
    var UserID = Guid.NewGuid ();
    var MyUser = new User () { ID = UserID };
    SaveUserToDatabase (MyUser);

    var ShopperRepresentation = GetUserAsShopper (UserID);
    //  Do stuff.
}
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Shopper>().ToTable("Shoppers");
modelBuilder.Entity<OtherUser>().ToTable("OtherUsers");
modelBuilder.Entity().ToTable(“用户”);
modelBuilder.Entity().ToTable(“购物者”);
modelBuilder.Entity().ToTable(“其他用户”);
如果这对你不起作用,请告诉我,我会看看我能做些什么

编辑:

看到你在下面的澄清,我想不出一个办法。您必须单独存储每个对象(让EF将购物者视为购物者,而不是购物者和用户),即使它们共享公共数据。这可能会导致数据不匹配(比如说,若购物者更新了姓氏,但用户并没有更新)。我想你最好还是做点像这样的事情:

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; }
}
公共类用户
{
公共虚拟Guid ID{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟商店信息{get;set;}
}
公共类Shoppenfo
{
公共虚拟ICollection订单{get;set;}
}
然后,当您需要将用户视为购物者时,只需访问ShopperInfo(如果它不在那里,则创建它)。EF将能够为您正确设置,没有问题


不过,如果你要有很多类型的用户,那可能会很麻烦。不过,这只是一个建议——我觉得它更干净了一点。

@Tim——谢谢你的回复!我可以很好地创建表格。我要做的是创建一个用户,然后插入它。然后,稍后,例如,使用与购物者相同的用户。PK是表单身份验证提供的用户ID。因此,根据用户正在做什么,他们将有一个不同的对象来表示他们。所以,一个用户对象不会包含任何关于他们购物体验的内容,但是他们的客户版本会包含。。。正在创建用户对象的实例。。。然后有时还会创建购物者实例?@Tim-是的,取决于他们访问的页面。这是同一个“人”使用相同的PK,但他们在做什么/他们能做什么的不同表示。好的,基于此,我编辑了我的推荐。我不确定你会喜欢它。但是我不知道如何沿着你所看到的方向走得更远。@Tim-作为对你编辑的回应,我感到震惊,这就是我必须要做的。我认为值得花时间四处打鱼,看看是否有其他人有不同的看法。我会等着看是否还有其他人有意见,如果没有更好的意见,我会给你答案。谢谢你的时间!