【问题标题】:Create a relation from list of Ids - Entity Framework从 ID 列表创建关系 - 实体框架
【发布时间】:2023-01-08 18:19:22
【问题描述】:

有没有办法使用 ID 列表创建关系?

我已经为如下的单个属性完成了此操作:

builder.HasOne<Employee>()
       .WithMany()
       .HasForeignKey(x => x.EmployeeId);

但是如果我有一个 EmployeeId 的列表,我就不知道该怎么做。

【问题讨论】:

  • “关系”不是“关系”,它是一组元组(即 TABLE 或 VIEW)。而“关系”应该通过其约束类型(或缺乏)明确引用,例如外键约束。请在未来使用明确和准确的术语。
  • 如果我有一个 EmployeeId 列表-- 请更具体一点。

标签: entity-framework-core .net-6.0


【解决方案1】:

在数据库中,您不会创建带有员工 ID 列表列的公司表......您可以将 CompanyId 添加到他们所属公司的员工表中,或者创建一个连接表 CompanyEmployee 链接两者.

实体框架实体本质上使用对象表示关系数据。公司可以有一个员工列表(不是员工 ID),其中 EF 将计算(或配置)以期望员工将管理返回其公司的 FK 引用。

public class Company
{
    [Key]
    public int CompanyId { get; set; } 

    public virtual ICollection<Employee> Employees { get; set; } = new List<Employee>();
}

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
  
    [ForeignKey("CompanyId")]
    public virtual Company Company { get; set; }
}

这是假设您使用的是 EF Core 6(给定 .Net Core 6 标记)对于 EF6,您需要为 CompanyId 定义 FK 属性或使用 .Map(x =&gt; x.MapKey()) 映射影子属性@ EF Core 可以更好地管理这一点。 EF 解决了这些关系,您不需要任何东西,例如尝试在 Company 上使用 List&lt;int&gt; 作为员工 ID。

现在,如果您碰巧想要获取给定公司的员工 ID,您可以通过公司或员工获取:

var employeeIds = context.Company
    .Where(x => x.CompanyId == companyId)
    .SelectMany(x => x.Employees.Select(e => e.EmployeeId).ToList())
    .ToList();

或者

var employeeIds = context.Employees
    .Where(x => x.CompanyId == companyId)
    .Select(x => x.EmployeeId)
    .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2021-06-24
    • 2020-06-01
    相关资源
    最近更新 更多