11

我正在尝试使用 Entity Framework 4、POCO 和 Code-Only 设置项目。

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

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

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 必须有某种类型的鉴别器才能知道它是否需要查看用户表或组表,但我可以使用仅代码或 EDMX 找出映射。

4

3 回答 3

1

我知道这是一个老问题,但不,实体框架(即使是最新版本 6)没有允许您使用界面类型映射导航属性的功能。

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

对多态导航属性的支持非常复杂。如果您假设原始AssignedTo属性映射到诸如AssignedToId int. 您必须联合或加入这两个实体集,UserGroup希望一个给定AssignedToId的只出现在其中一个中。这是Table-Per-Concrete (TPC)类型映射使用的方法,但它仅适用于类继承(而不是接口)和在参与类型中生成不同 id 的仔细规划。

于 2015-01-04T23:23:48.980 回答
1

您可以在导航属性中使用界面,看看这个解决方案,因为它与问题相同: How to use interface properties with CodeFirst

于 2013-12-09T10:58:29.917 回答
0

通过使用 EF4 支持的文本模板转换工具包 (T4),您可以节省大量工作。在寻找手动创建我的 POCO 和界面的方法后,我发现了这个,12 小时,

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

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

于 2010-12-05T10:39:04.113 回答