关于c#:使用带有导航属性的接口

Using an Interface with a navigation property

我正在尝试使用EntityFramework4、Poco和仅代码来设置项目。

在实体框架中,导航属性的类型是否可能是接口?

我有一个"任务"课。任务可以分配给一个用户或一个组,每个用户或组由一个单独的类表示,并存储在单独的表中。这些类看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class User : IAssignable
{
    public String Name { get; set; }
    public int ID { get; set; }
    public String Email { get; set; }
    public String Password { get; set; }
}

public class Group : IAssignable
{
    public String Name { get; set; }
    public int ID { get; set; }
    public String Manager { get; set; }
    public String Department { get; set; }
}

public class Task
{
    public String Title { get; set; }
    public DateTime DueDate { get; set; }
    public String Details { get; set; }
    public IAssignable AssignedTo { get; set; }
}

在实体框架中,是否有一种方法可以将assignedto属性作为导航属性?我假设ef必须有某种类型的鉴别器才能知道它是否需要在users表或groups表中查找,但是我可以使用code only或edmx来确定映射。


我知道这是一个老问题,但不,实体框架(甚至最新版本6)没有允许您将导航属性映射为接口类型的功能。

但是,您可以将多个导航属性映射为具体的类型(以及只能设置一个的约束),并提供接口类型的未映射属性,该属性将具体的导航属性合并为单个属性。不幸的是,这可能会使您的查询更加复杂,因为某些查询需要知道要引用哪些具体的导航属性(并且不能对未映射的接口属性进行查询)。

对于多态导航属性的支持有着显著的复杂性。考虑如果假设原始AssignedTo属性映射到一列(如AssignedToId int列),那么查询原始AssignedTo属性时会发生什么情况。你必须联合或加入UserGroup实体集合,并希望给定的AssignedToId只出现在其中一个集合中。这是表每具体(TPC)类型映射所使用的方法,但它只适用于类继承(而不是接口)和在参与类型之间生成不同ID的仔细计划。


您可以在导航属性中使用Interface,查看此解决方案,因为它与问题相同:如何将接口属性与codeFirst一起使用


通过使用EF4支持的文本模板转换工具包(T4),您可以节省大量的工作。我花了12个小时寻找一种方法来手动创建我的Poco和界面,终于找到了这个方法。

http://blogofrab.blogspot.com/2010/08/maintenance-free-mocking-for-unit.html

除了为单元测试提供出色的基础之外,它还根据模型中定义的关系自动生成导航属性。