我的实体模型中是否应该有外键列?

Ste*_*aly 5 c# nhibernate fluent-nhibernate

我将从实体框架转到NHibernate.在查看如何创建我的域实体时,我注意到在某些示例中,它们不包含外键关系的列.由于Session该类包含一个Load()方法,因此可以在不使用数据库而不是主键的情况下使用对象.这是NHibernate中构造实体模型时的常规做法.

示例实体

public class BlogPost : Entity
{
    public virtual string Name { get; set; }

    //Should this be here
    public virtual int AuthorID { get; set; }

    public virtual Author Author { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

创建实体

BlogPost post = new BlogPost
{
    Name = "My first post",
    Author = session.Load<Author>(1) //Avoids hitting the database
};

session.Save(post);
Run Code Online (Sandbox Code Playgroud)

- 要么 - -

BlogPost post = new BlogPost
{
    Name = "My first post",
    AuthorID = 1 //Use the id of the object
};

session.Save(post);
Run Code Online (Sandbox Code Playgroud)

Mir*_*vic 4

您应该使用完整的实体/对象而不是外键。

外键是数据库概念。当您进行面向对象编程时,它们没有多大意义。在进行 OOP 时,您是将对象组合在一起。在你的例子中, aBlog 一个Posts. Post 父母Blog

实体ID仅用于唯一标识实体。

对象关系映射的全部要点应该是允许您使用 OOP 最佳实践(对象)、数据库最佳实践(关系),而不是混合它们之间的概念(这就是名称中的映射部分所代表的含义)。

一些 ORM 在遵循这一点方面比其他 ORM 更好。提示:NHibernate

  • @Moses 这也是“NHibernate”做事的方式。“Author”的 ID 在数据库中用作从“BlogPosts”表到“Authors”表(或任何您想要的名称)的外键。NHibernate 可以从您的实体(实际上是实体映射)生成数据库模式。您只是不需要在实体中拥有实际的外键。您拥有一个“Author”实例,而不是“AuthorId”属性。NHibernate 在执行查询时创建正确的连接。 (2认同)