【发布时间】:2017-11-24 19:11:46
【问题描述】:
我有以下类,我首先尝试使用 Entity Framework 6 代码将它们存储在数据库中。
人:
public class Person
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<WorkItem> WorkItems { get; set; }
}
工作项:
public class WorkItem
{
public Guid Id { get; set; }
public string Description { get; set; }
public Person Creator { get; set; }
}
如您所见,每个人都可以有许多任务。但是(!)该任务也有一个创建者是一个人。
我希望使用实体框架的 add-migration 创建的工作项表有两个外键。一种是使工作项可以混合到 Person 的 WorkItems 集合中,另一种是指向工作项的创建者。如下图所示:
这似乎不是一个奇怪的场景,但它给我带来了很多问题。
如果您只是尝试使用 add-migration 创建数据库表,则 WorkItem 将按以下方式创建:
CreateTable(
"dbo.WorkItems",
c => new
{
Id = c.Guid(nullable: false),
Description = c.String(),
Creator_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.People", t => t.Creator_Id)
.Index(t => t.Creator_Id);
如您所见,这里没有任何东西使 Person 成为其工作项的所有者。如果我删除 Creator 属性,它会按预期工作。当该类是所有者时,引用该类似乎存在问题。
为什么这不能开箱即用,最好的解决方法是什么?导航属性?流畅的API?
【问题讨论】:
-
你在哪里“引用同一张表”?您的问题和发布的代码不等价。
-
抱歉,我发现很难给这个问题起一个好的标题。我的代码的最终结果首先应该是一个名为 WorkItem 的表,它有两个对 Person 表的引用(外键)。一个是因为 Person 有一个工作项列表,一个是因为 WorkItem 有一个人的引用。
-
这意味着您实际上在 WorkItem 表中存储了两个 PersonId,这是您想要的吗?目前尚不清楚为什么你想要两个参考,而一个完全没问题
-
是的,没错。 Workitem 表中应该有两个对 Person 的引用。我已经解释了原因:“正如你所看到的,每个人都可以有许多任务。但是(!)任务也有一个创造者,就是一个人。”当然,可能有更好的方法来解决这个问题。也许我的做法是错误的。
标签: c# sql-server entity-framework-6 ef-code-first