EF Code First Multiple Inheritance是独家的吗?

时间:2013-02-15 00:41:51

标签: entity-framework inheritance ef-code-first

假设我有一个模型,其中我有Person实体,其中包含一般信息(名称,出生日期等),以及从Person继承的另外两个实体(Customer,W​​orker)。如您所见,可以选择让客户也可以在模型中扮演工人的角色。有一种方法可以在EF中设计这个(我看到了一些关于TPH,TPT和TPC的东西),但我发现有一个鉴别器的使用,它不允许Person表“同时”包含Worker和Customer的值。

我不知道是否我对继承的一般OOP概念出错:S。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你不能在.net中有多重继承,它不受支持(同样适用于实体框架)。您可以实现多个接口,但这是一个略有不同的概念 - 即'Worker'可以是由某些对象实现的接口,例如客户

在实体框架中,我认为仅在使用Table-per-hierarchy时才实现鉴别器。这是两个子实体存储在同一个表中的位置,鉴别器标识哪个是。

每个类型的表基本上是实体(个人,客户,工人)存储在不同的表中,但可以作为代码中的单个实体(即具有人的继承的客户)访问

可能需要创建一个接口(可能是IWorker),并创建一个继承自Customer的类(可能是WorkerCustomer ??)并实现IWorker。

编辑:15/02/2013 19:00

好的,所以下面的内容可能是您在单个表格中表示数据的目的:

public class MyDbContext : DbContext
{
    public MyDbContext() : base("TestDB")
    {

    }

    public DbSet<Person> People { get; set; }
    public DbSet<Customer> Customers { get; set; }
    public DbSet<Worker> Workers { get; set; }
    public DbSet<WorkerCustomer> WorkerCustomers { get; set; }
}

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Customer : Person
{
    public string CustomerNumber { get; set; } 
}

public interface IWorker
{
    string WorkerNumber { get; set; }
}

public class Worker : Person, IWorker
{
    public string WorkerNumber { get; set; }
}

public class WorkerCustomer : Customer
{
    public string WorkerNumber { get; set; }
}