我很难使用EF Core(1到很多)定义我想要的关系。
E.G:
我是Task
和Employee
的实体,每个任务都是由员工执行的,并且也指定给了员工。我创建了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关系的实体时,是否足以在所有者实体中添加属性,而对拥有的实体不执行任何操作?还是我必须指定[拥有的]注释?
答案 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
命名,则实际上每次使用任一个名称空间时都必须指定名称空间,这很麻烦。