关于c#:可以在Entity Framework Code First中使用接口创建我的模型吗?

Can use interfaces in creating my models in Entity Framework Codefirst?

我是实体框架的新手,我在练习代码优先。我的问题是我正在创建一个模型类,我希望该类从另外两个类继承。例如,员工有个人信息,如名字、中间名、姓氏等…它还具有联系信息,如地址、电话、电子邮件等…学生也有这些属性。我将这些信息分为两类的原因是,另一个实体也可以拥有联系信息,但没有个人信息,例如公司、学校、医院、仓库等。

样本代码:

1
2
3
4
5
6
    public class ContactInfo
    {
    public string Address { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    }
1
2
3
4
5
6
    public class PersonalInfo
    {
    public string Firstname { get; set; }
    public string Middlename { get; set; }
    public string Lastname { get; set; }
    }
1
2
3
4
    public class Employee : // This should be inheriting from PersonalInfo and ContactInfo
    {
    public int EmployeeID { get; set; }
    }
1
2
3
4
5
    public class Supplier : ContactInfo // Inheriting from ContactInfo and no PersonalInfo
    {
    public int SupplierID { get; set; }
    public string Name { get; set; }
    }

我要做的是创建要由员工继承的接口(ipersonalinfo、icontactinfo),以便看起来像这样:

1
2
3
4
    public class Employee : IPersonalInfo,IContactInfo
    {
    public int EmployeeID { get; set; }
    }

这是个好习惯吗?如果没有,我怎么能应付这种情况……谢谢!


首先,听起来您好像混淆了继承和组合。继承的一个例子是拥有一个普通人基类,从中可以继承一个雇员或学生。组合的一个例子是雇员和供应商,每个人都由一个公共的contactinfo对象组成,但没有公共的基类。

在设计实体时,实际上是在设计底层关系数据库的表结构。您可以为继承建模:一个公共的基类可以由它自己的表和任何公共字段表示,并且任何专门化的类都可以在它们自己的表中,带有一个链接到公共表的外键。这样做可能有意义,也可能没有意义——通过将事情分成不同的表,您正在向查询添加另一个联接。这会降低性能。

组合也可以在关系数据库中表示,但只有当它是许多其他数据实体共享的公共组件时,它才真正有意义。对于给定的人员/供应商,contactinfo几乎总是唯一的,因此将其分解为单独的表是没有意义的-您只是添加了一个额外的表联接,这将再次降低查询的性能。

您应该考虑在设计中将继承/组合向上移动一层。实体(数据访问层)应该与关系数据库相匹配,但是域模型(即业务对象层)应该遵循面向对象的原则。


你必须在模型中定义继承。在这之后,确保您定义了一个/多对一/多关系。参考链接这里,好的教程。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementation-inheritation-with-the-entity-framework-in-an-asp-net-mvc-application