我只是 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 id
和 assignedForm
你的 Answer
需要在它的 id 上有 FK 和 PK
和 assignedForm
否则 EF 不会将其视为一对一关系。即使您将 question
和 assignedForm
标记为数据库中的唯一约束(使其在数据库中一对一),EF 仍然无法将其处理为一对一,因为它还不支持唯一约束(PK 除外)。
关于c# - 使用 Fluent API 在遗留数据库中建立一对一关系的复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791988/