繁体   English   中英

EF Core 定义“复杂”关系

[英]EF Core defining “complex” relation

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

例如:

我是TaskEmployee的一个实体,每个任务都由一个员工给出,也被指定给一个员工。 我创建了Task class 如下:

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

我想我做得对,但我的员工 class 有问题。 通常(当只有一个加入时)我会简单地在 Employee 中创建Task属性的虚拟集合。但是我现在应该做什么? 这足以设置关系还是我应该为这两个任务添加虚拟属性?

还有一件事,当我有一个拥有 1-Many 关系的拥有实体时,是否足以在拥有者实体中添加属性,而在拥有的实体中什么也不做? 还是我必须指定 [Owned] 注释?

问题是您在相同的两个实体之间有两个一对多的关系。 对于Employee class,您需要两个 collections,每个关系一个。 此外,您需要使用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 创建一个动态代理 class 继承自您的实体并覆盖导航属性上的 getter。 C# 中需要virtual关键字,以允许覆盖 class 成员。

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

最后,您应该重新考虑此 class 的名称Task .NET 已经有一个Task class,而且使用频率很高。 如果您还将您的 class Task命名为,您几乎每次使用任何一个时都必须指定命名空间,这很痛苦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM