EF Core定义“复杂”关系

时间:2019-10-23 13:14:07

标签: c# entity-framework-core

我很难使用EF Core(1到很多)定义我想要的关系。

E.G:

我是TaskEmployee的实体,每个任务都是由员工执行的,并且也指定给了员工。我创建了Task类,如下所示:

public class Task
{
    public int TaskId { get; set; }
    [ForeignKey("RequestedBy")]
    [Required]
    public int RequestedById { get; set; }
    [Required]

    [ForeignKey("TaskedTo")]
    public int TaskedToId { get; set; }
    public virtual Employee RequestedBy { get; set; }
    public virtual Employee TaskedTo { get; set; }
}

我认为我做得正确,但是我的Employee类有问题。通常(只有一个联接时),我只是在Employee ..中创建Task属性的虚拟集合,但是我现在该怎么办?这足以设置关系,还是应该为这两个任务添加虚拟属性?

还有另一件事,当我拥有一个拥有1-Many关系的实体时,是否足以在所有者实体中添加属性,而对拥有的实体不执行任何操作?还是我必须指定[拥有的]注释?

1 个答案:

答案 0 :(得分:1)

问题是,在同一两个实体之间您有两个一对多关系。对于Employee类,您将需要两个集合,每个关系一个。此外,您需要使用InverseProperty属性来告诉EF哪个外键与哪个集合一起使用:

public class Employee
{
    ...

    [InverseProperty(nameof(Task.RequestedBy))]
    public ICollection<Task> RequestedTasks { get; set; }

    [InverseProperty(nameof(Task.TaskedTo))]
    public ICollection<Task> AssignedTasks { get; set; }
}

您不需要virtual。这是为了启用延迟加载。对于延迟加载功能,EF创建了一个动态代理类,该类从您的实体继承,并覆盖了导航属性上的getter。 C#中必须使用virtual关键字才能覆盖类成员。

此外,Owned属性用于值对象。这是一种具有相关类的方式,该类的属性实际上被映射到同一张表,或者如果给定了自己的表,则固有地绑定到“拥有”它的实体,以便您可以通过访问该数据。实体,而不是单独。这两个都不适用。

最后,您应该重新考虑此类的名称Task。 .NET已经有一个Task类,并且使用非常频繁。如果您还为类Task命名,则实际上每次使用任一个名称空间时都必须指定名称空间,这很麻烦。