考虑以下实体之间的关系:
class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
}
class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int PostId { get; set; }
public Post Post { get; set; }
}
好吧,在这种情况下,没有人在他们的正确思想中会一对一的关系。这不是这里的问题...
您会注意到,对于每个导航属性(Author
和Post
),分别定义了明确的ID列(AuthorId
和PostId
)。
我个人不喜欢这种方法(尽管我可以看到一些潜在的好处)。我希望EF为我内部管理Id列,只让我公开Post
和Author
之间的关系。
我想知道的是,对于明确的ID列,有没有官方建议?
注意::我确实知道在一个地方显式ID映射很重要,那就是在实现多对多联接表时。您可以使用ID创建一个唯一约束,以防止相同多对多关系的记录重复。
答案 0 :(得分:1)
我想知道的是,对于明确的ID列,有没有官方建议?
是:
建议在模型中包括映射到的属性 数据库中的外键。加上外键属性, 您可以通过修改外键来创建或更改关系 依赖对象上的值。这种关联称为 外键协会。使用外键更为重要 在使用N-Tier应用程序时。
答案 1 :(得分:0)
这不是“官方建议”。但是,这就是我的看法。
您希望将导航属性虚拟化以进行延迟加载,并且需要两个Id列才能映射到数据库。
但是您的代码从不使用那些外键。这是一个将帖子与作者链接的示例。
var p = new Post {Title="Foo"};
p.Author = _db.Authors.First(a => a.Id == 5);
_db.Posts.Add(p);
_db.SaveChanges();
您还需要将这些字段映射到您的域层中,以跟踪关系。