gpt4 book ai didi

c# - 使用 Fluent API 在遗留数据库中建立一对一关系的复合外键

转载 作者:行者123 更新时间:2023-11-30 17:12:19 25 4
gpt4 key购买 nike

我只是 EF 代码优先模型的初学者。给定两个映射到当前遗留 MS SQL 数据库的 POCO 类。它们与建立一对多关系的复合外键相关联。因为它实际上是一对一的关系,所以我想在我的 POCO 对象中有相应的导航属性,并在流畅的 API 中进行映射。这是我的例子:

public partial class Answer
{
//primary key
public int id { get; set; }

//foreign keys
public int question { get; set; }
public int assignedForm { get; set; }

//simple fields
public short state { get; set; }
public int author { get; set; }

//navigation property
public virtual AssignedQuestion AssignedQuestion { get; set; }
}

public partial class AssignedQuestion
{
// primary keys
public int id { get; set; }
public int assignedForm { get; set; }

//simple field
public string content { get; set; }

//navigation property
//public virtual ICollection<Answer> Answers { get; set; }
public virtual Answer Answer { get; set; }
}

如果我想建立一对多关系,我只需取消注释“Answers”集合并使用 Fluent API 映射:

modelBuilder.Entity<AssignedQuestion>()
.HasKey(q => new { q.id, q.assignedForm });

modelBuilder.Entity<Answer>()
.HasRequired(a => a.AssignedQuestion)
.WithMany(aq=>aq.Answers)
.HasForeignKey(a => new { a.question,a.assignedForm});

我的目标是使用一对一关系,并在 AssignedQuestion 中使用“Answer”属性,使用如下 Fluent API:

modelBuilder.Entity<AssignedQuestion>()
.HasKey(q => new { q.id, q.assignedForm });

modelBuilder.Entity<Answer>()
.HasRequired(a => a.AssignedQuestion)
.WithOptional(aq => aq.Answer);
//.HasForeignKey(a => new { a.question, a.assignedForm });

问题是我无法准确指定外键字段(如前例所示)并取消注释 HasForeignKey 调用。在这种情况下,EF 尝试使用常规字段名称“AssignedQuestion_ID”和“AssignedQuestion_AssignedForm”而不是 Answer 表中的“question”和“assignedForm”来连接表。除了更改字段名称外,在 Fluent API 中是否有变通方法?

最佳答案

这不是一对一关系,因此您的第一个映射是正确的。之所以是一对多,是因为EF只有在双方建立PKs的时候才理解一对一。如果 AssignedQuestion 有 PK idassignedForm 你的 Answer 需要在它的 id 上有 FK 和 PK assignedForm 否则 EF 不会将其视为一对一关系。即使您将 questionassignedForm 标记为数据库中的唯一约束(使其在数据库中一对一),EF 仍然无法将其处理为一对一,因为它还不支持唯一约束(PK 除外)。

关于c# - 使用 Fluent API 在遗留数据库中建立一对一关系的复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791988/

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