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.