entity framework,代码优先:将主 – 细节与零对一关系相结合

我使用代码首先EF有一个简单的主 – 细节关系:

public class User { public string Id { get; set; } public ICollection Tasks { get; set; } } public class Task { public string Id { get; set; } [Required] public string UserId { get; set; } public User User { get; set; } } 

现在我想修改它,以便用户可以完成一项最重要的任务。 所以我修改了User类来添加它:

 public class User { public string Id { get; set; } public ICollection Tasks { get; set; } public string MostImportantTaskId { get; set; } [ForeignKey("MostImportantTaskId")] public Task MostImportantTask { get; set; } } 

但是,当我运行Add-Migration时,我得到了意想不到的结果。 EF正在尝试将User_Id列添加到Tasks表中,这是我不想要的,并删除了主/详细关系所需的外键:

 public override void Up() { DropForeignKey("dbo.Tasks", "UserId", "dbo.Users"); AddColumn("dbo.Tasks", "User_Id", c => c.String(maxLength: 128)); AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); CreateIndex("dbo.Tasks", "User_Id"); CreateIndex("dbo.Users", "MostImportantTaskId"); AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); AddForeignKey("dbo.Tasks", "User_Id", "dbo.Users", "Id"); } public override void Down() { // ... } 

那么如何在向User类添加对单个任务的引用的同时,如何维护用户和任务之间的主细节关系?

这不是我过分熟悉的东西,但我相信你正在寻找的是InverseProperty 。 由于您的User类与Task有多个关系,因此您需要将InverseProperty添加到Tasks集合中,以将其指向Task上的User属性。

因此,如果您在User类中进行此更改

 [InverseProperty("User")] public ICollection Tasks { get; set; } 

然后,当您运行迁移时,会生成以下代码,这看起来就像您所追求的那样

 public override void Up() { AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); CreateIndex("dbo.Users", "MostImportantTaskId"); AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); } public override void Down() { DropForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks"); DropIndex("dbo.Users", new[] { "MostImportantTaskId" }); DropColumn("dbo.Users", "MostImportantTaskId"); } 

基于entityframeworktutorial.net上的示例。

注意:我假设你在代码中引用了一个Tasks类,这是Task.一个错字Task.