我有一个简单的主 - 细节关系,首先使用代码EF:
public class User
{
public string Id { get; set; }
public ICollection<Tasks> 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> 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
类添加对单个任务的引用的同时,如何维护用户和任务之间的主细节关系?
答案 0 :(得分:3)
这不是我过于熟悉的东西,但我相信你所寻找的是InverseProperty
。由于您的User
类与Task
存在多种关系,因此您需要将InverseProperty
添加到Tasks
集合中,以将其指向User
上的Task
属性1}}。
因此,如果您在User
班级中进行此更改
[InverseProperty("User")]
public ICollection<Task> 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.
的错字