Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用具有导航属性的接口_C#_.net_Entity Framework_Entity Framework 4_Code First - Fatal编程技术网

C# 使用具有导航属性的接口

C# 使用具有导航属性的接口,c#,.net,entity-framework,entity-framework-4,code-first,C#,.net,Entity Framework,Entity Framework 4,Code First,我正在尝试仅使用实体框架4、POCO和代码来设置项目 在实体框架中,导航属性的类型是否可以作为接口 我有一门“任务”课。任务可以分配给用户或组,每个用户或组由单独的类表示,并存储在单独的表中。这些类看起来像这样: public class User : IAssignable { public string Name { get; set; } public int ID { get; set; } public string Email { get; set; }

我正在尝试仅使用实体框架4、POCO和代码来设置项目

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

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

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找出映射。

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


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

您可以使用导航属性中的界面,查看此解决方案,因为它与问题相同:

我知道这是一个老问题,但不是,Entity Framework(甚至最新版本6)没有允许您将导航属性映射为接口类型的功能

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

多态导航属性的支持非常复杂。如果您假设它被映射到一个列,如“代码> AsgigNeToID INT/Cuth>”,那么考虑一下,为了查询原始代码< > Asgignto属性,将会发生什么。您必须联合或加入
User
Group
实体集,并希望给定的
AssignedToId
仅出现在其中一个实体集中。这是类型映射所使用的方法,但它只适用于类继承(而不是接口)和仔细规划跨参与类型生成不同ID