【问题标题】:Using an Interface with a navigation property使用带有导航属性的接口
【发布时间】:2011-01-02 06:38:48
【问题描述】:

我正在尝试使用 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 必须有某种类型的鉴别器才能知道它是否需要查看 Users 表或 Groups 表,但我可以使用 Code-Only 或 EDMX 找出映射。

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4 code-first


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-01
          • 2013-01-17
          相关资源
          最近更新 更多