使用带有导航属性的接口

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; }
}

有没有办法在EF中将AssignedTo属性作为导航属性?我想EF需要一些鉴别器来知道它是需要在Users表还是Groups表中进行查找,但我可以使用Code-Only或EDMX确定映射。

3个回答

1

1
我知道这是一个老问题,但是即使是最新版本的Entity Framework(版本6),也没有允许你将导航属性与接口类型进行映射的功能。但是,你可以使用具体类型映射多个导航属性(并添加只能设置一个的约束),并提供一个未映射的接口类型属性,该属性将具体的导航属性合并为一个属性。不幸的是,这可能会使你的查询更加复杂,因为某些查询需要知道引用哪些具体的导航属性(而且你不能对未映射的接口属性进行查询)。
支持多态导航属性存在相当复杂的问题。考虑如果假设AssignedTo属性映射到一个列,例如AssignedToId int,那么要查询原始属性需要发生什么。您必须联合或连接UserGroup实体集,并希望给定的AssignedToId只出现在其中一个实体集中。这是表格-每个具体(TPC)类型映射使用的方法,但它仅适用于类继承(而不是接口),并且需要对参与类型生成不同的id进行仔细规划。

0

如果你使用EF4支持的文本模板转换工具(T4),就可以省去很多工作。在经过长达12个小时的寻找手动创建POCO和接口的方法后,我发现了这个工具。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接