使用具有导航属性的接口

时间:2010-01-06 22:34:22

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

我正在尝试使用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来计算映射。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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