我正在尝试使用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来计算映射。
答案 0 :(得分:1)
你可以在导航属性中使用界面,看看这个解决方案,因为它与问题相同: How to use interface properties with CodeFirst
答案 1 :(得分:1)
我知道这是一个老问题,但不,实体框架(甚至最新版本6)没有允许您使用接口类型映射导航属性的功能。
但是,您可以使用具体类型(以及只能设置一个约束的约束)映射多个导航属性,并提供接口类型的未映射属性,该属性将具体导航属性合并为单个属性。不幸的是,这可能会使您的查询更加复杂,因为某些查询需要知道要引用的具体导航属性(并且您无法查询未映射的接口属性)。对多态导航属性的支持存在很大的复杂性。如果您认为它已映射到AssignedTo
之类的列,请考虑查询原始AssignedToId int
属性时必须发生的情况。您必须联合或加入User
和Group
个实体集,并希望给定AssignedToId
只出现在其中一个实体集中。这是Table-Per-Concrete (TPC)类型映射使用的方法,但它仅适用于类继承(而不是接口),并且仔细规划以在参与类型中生成不同的ID。
答案 2 :(得分:0)
通过使用EF4支持的文本模板转换工具包(T4),您可以节省大量工作。经过12个小时的手动创建POCO和界面后,我找到了这个,
http://blogofrab.blogspot.com/2010/08/maintenance-free-mocking-for-unit.html
除了为单元测试提供了出色的基础外,它还可以根据模型中定义的关系自动生成导航属性。