代码之家  ›  专栏  ›  技术社区  ›  Matthew Layton

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

  •  1
  • Matthew Layton  · 技术社区  · 6 年前

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

    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在内部为我管理i d列,并让我公开 岗位 作者 是的。

    我想知道的是,对于显式id列有没有官方的建议?

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Browne - Microsoft    6 年前

    我想知道的是,对于显式id列有没有官方的建议?

    对:

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

    Entity Framework Relationships and Navigation Properties

        2
  •  0
  •   Thomas Koelle    6 年前

    这不是“官方推荐”。但我是这样看的。

    您希望导航属性是虚拟的,以便延迟加载,并且需要两个id列来映射到数据库。

    但是你的代码从不使用那些外键。下面是一个链接文章和作者的例子。

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

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