实体框架,代码优先:将主 - 细节与零对一关系相结合

时间:2016-07-03 19:51:40

标签: c# entity-framework

我有一个简单的主 - 细节关系,首先使用代码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类添加对单个任务的引用的同时,如何维护用户和任务之间的主细节关系?

1 个答案:

答案 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.的错字