假设我有一个模型,其中有带有一般信息(姓名、出生日期等)的 Person 实体,以及从 Person 继承的两个附加实体(客户、工人)。如您所见,可以选择让客户也可以在模型中扮演工人的角色。有一种方法可以在 EF 中进行设计(我看到了一些关于 TPH、TPT 和 TPC 的内容),但我看到使用了鉴别器,它不允许 Person 表“同时”包含 Worker 和 Customer 的值。
我不知道我是否对继承的一般 OOP 概念有误:S。
提前感谢您的所有帮助。
假设我有一个模型,其中有带有一般信息(姓名、出生日期等)的 Person 实体,以及从 Person 继承的两个附加实体(客户、工人)。如您所见,可以选择让客户也可以在模型中扮演工人的角色。有一种方法可以在 EF 中进行设计(我看到了一些关于 TPH、TPT 和 TPC 的内容),但我看到使用了鉴别器,它不允许 Person 表“同时”包含 Worker 和 Customer 的值。
我不知道我是否对继承的一般 OOP 概念有误:S。
提前感谢您的所有帮助。
您不能在 .net 中进行多重继承,它不受支持(这同样适用于实体框架)。您可以实现多个接口,但这是一个稍微不同的概念 - 即“工人”可能是由某些对象(例如客户)实现的接口
在实体框架中,我相信只有在使用 Table-per-hierarchy 时才实现鉴别器。这是两个子实体存储在同一个表中的位置,鉴别器识别哪个是哪个。
Table-per-type 本质上是实体(person、customer、worker)存储在不同的表中,但可以作为代码中的单个实体访问(即继承自 person 的客户)
可能你需要创建一个接口(可能是IWorker),并创建一个类(可能是WorkerCustomer??)继承自Customer,并实现IWorker。
编辑:2013 年 2 月 15 日 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; }
}