使用 CodeFirst 的 C# 一对零或一关系

C# One-To-Zero-Or-One relationship using CodeFirst

所以我有以下代码:

ParentModel.cs

public class ParentModel {
   public int ParentModelID {get; set;}
   ...other fields here

   public ChildModel ChildModel {get; set;}
}

ChildModel.cs

public class ChildModel{
   [ForeignKey("ParentModel")]
   public int ChildModelID {get; set;}
   ...other fields and navigation properties here

   public int ParentModelID {get; set;}
   public ParentModel ParentModel {get; set;}
}

至此数据库生成成功。当我尝试保存数据时出现问题。例如,我先将数据保存到 ParentModel 并成功保存。但是当我在 ChildModel 中保存时,即使我的数据包含 ParentModel 的 ID,它也会给我以下错误:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.ChildModels_dbo.ParentModels_ChildModelID". The conflict occurred in database "MyDatabaseName", table "dbo.ParentModels", column 'ParentModelID'. The statement has been terminated.

使用流利的跟随api

public class ParentModel {

   public int ParentModelID {get; set;}
   ...other fields here
   public virtual ChildModel childModel {get; set;}

}


public class ChildModel{
   public int ParentModelID {get; set;}
   public int ChildModelID {get; set;}
   ...other fields and navigation properties here


   public virtual ParentModel parentModel {get; set;}
}

那我会用流利的api来建立关系

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Configure ParentModelID as PK for ChildModel
    modelBuilder.Entity<ChildModel>()
        .HasKey(e => e.ParentModelID);

    // Configure ParentModelID as FK for ChildModel
    modelBuilder.Entity<ParentModel>()
                .HasOptional(s => s.childModel) 
                .WithRequired(ad => ad.ParentModelID); 

}

你几乎成功了;您想要一个已设置的共享主键。问题是您可能将 ChildModel.ParentModelID 属性 设置为 parent 的 ID。删除 属性 并将 ChildModel.ChildModelID 设置为 Parent 实体的 ParentModelID - ChildModelIDParentModel 实体的 FK。您还需要使 ChildModel.ParentModel 成为必填项。

public class ParentModel 
{
   public int ParentModelID {get; set;}
   public ChildModel ChildModel {get; set;}
}

public class ChildModel
{
   [ForeignKey("ParentModel")]
   public int ChildModelID {get; set;}
   [Required]
   public ParentModel ParentModel {get; set;}
}

var parent = new ParentModel();
dbContext.Set<ParentModel>().Add( parent );
dbContext.SaveChanges();

var child = new ChildModel()
{
     ChildModelID = parent.ParentModelID
};
dbContext.Set<ChildModel>().Add( child );
dbContext.SaveChanges();

参见 this answer 了解另一个示例。