实体框架-显式映射的ID列

时间:2018-07-09 11:02:14

标签: c# entity-framework

考虑以下实体之间的关系:

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; }
}

好吧,在这种情况下,没有人在他们的正确思想中会一对一的关系。这不是这里的问题...

您会注意到,对于每个导航属性(AuthorPost),分别定义了明确的ID列(AuthorIdPostId)。

我个人不喜欢这种方法(尽管我可以看到一些潜在的好处)。我希望EF为我内部管理Id列,只让我公开PostAuthor之间的关系。

我想知道的是,对于明确的ID列,有没有官方建议?

注意::我确实知道在一个地方显式ID映射很重要,那就是在实现多对多联接表时。您可以使用ID创建一个唯一约束,以防止相同多对多关系的记录重复。

2 个答案:

答案 0 :(得分:1)

  

我想知道的是,对于明确的ID列,有没有官方建议?

是:

  

建议在模型中包括映射到的属性   数据库中的外键。加上外键属性,   您可以通过修改外键来创建或更改关系   依赖对象上的值。这种关联称为   外键协会。使用外键更为重要   在使用N-Tier应用程序时。

Entity Framework Relationships and Navigation Properties

答案 1 :(得分:0)

这不是“官方建议”。但是,这就是我的看法。

您希望将导航属性虚拟化以进行延迟加载,并且需要两个Id列才能映射到数据库。

但是您的代码从不使用那些外键。这是一个将帖子与作者链接的示例。

var p = new Post {Title="Foo"};
p.Author = _db.Authors.First(a => a.Id == 5);
_db.Posts.Add(p);
_db.SaveChanges();

您还需要将这些字段映射到您的域层中,以跟踪关系。