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

标签 c# .net entity-framework composite-key one-to-one

我只是 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/

相关文章:

c# - 最大数组维度,如 a[1][1][1][1]....[1]在 C#

.net - 确定是什么阻塞了 UI 线程

c# - .NET 中的嵌套字典集合

c# - 使用 LINQ for Entity Framework 将实体转换为通用方法中的已实现接口(interface)

c# - 如何从引用另一个脚本的 C# 运行 Powershell 脚本

c# - 将属性添加到另一个程序集的类

c# - “查询值的数量和目标字段不一样。”

c# - WPF 只能打开一个窗口?

sql-server - 在锁定的模型设计器中使用强空间类型选项?

entity-framework - MVC3 应用程序/服务层/存储库层/POCO 类/EF4 - 问题!