gpt4 book ai didi

c# - EF 6.1 Code First 中与不同主键的一对一关系

转载 作者:行者123 更新时间:2023-11-30 13:54:15 26 4
gpt4 key购买 nike

我在使用 Entity Framework 6.1 从 PayGroup 对象获取对员工对象的引用时遇到问题。我在 PayGroup.SupervisorId -> Employee.EmployeeId 的数据库中有一个外键。请注意,这是零或一对一的关系(一个薪酬组只能有一个主管,一个员工只能是一个薪酬组的主管)。

根据 this post on GitHub , 在具有不同主键的表上不可能有外键。我已经手动将外键添加到数据库中,但我无法弄清楚如何设置流畅的 API 映射以便能够从薪酬组获取员工对象。

薪酬组表

Pay Group Table

员工表

Employee Table

注意:数据库中的 PayGroup.SupervisorId - Employee.EmployeeId 有一个外键。

下面是 DTO(我目前在这些类之间没有任何工作关系映射):

public class PayGroup
{
public int Id { get; set; }
public string SupervisorId { get; set; }
public virtual Employee Supervisor { get; set; }
}

public class Employee
{
public string EmployeeId { get; set; }
public string FullName { get; set; }
}

最佳答案

不支持与显式 FK 属性(如您的 PayGroup.SupervisorId)的

一对一 关系。

因此从模型中删除该属性:

public class PayGroup
{
public int Id { get; set; }
public virtual Employee Supervisor { get; set; }
}

并使用以下流畅的映射:

modelBuilder.Entity<PayGroup>()
.HasRequired(e => e.Supervisor)
.WithOptional()
.Map(m => m.MapKey("SupervisorId"));

WithOptional() 调用指定了两件事。首先,Employee 类中没有反向导航属性,其次,FK 是可选的(表中的Allow Nulls = true)。

如果您决定添加反向导航属性

public class Employee
{
public string EmployeeId { get; set; }
public string FullName { get; set; }
public virtual PayGroup PayGroup { get; set; } // <=
}

将其更改为 WithOptional(e => e.PayGroup)

如果你想让它成为必需的(Allow Nulls = false in the table),然后使用相应的WithRequiredDependent重载(Dependent 这里意味着 Employee 将是 principalPayGroup 将是 dependent)。

关于c# - EF 6.1 Code First 中与不同主键的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com