c# - 我的实体模型中应该有外键列吗?

标签 c# nhibernate fluent-nhibernate

我正从 Entity Framework 转到 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; }
}

创建实体

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

session.Save(post);

-- 或 ---

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

session.Save(post);

最佳答案

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

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

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

整点Object-Relational Mapping应该是允许您使用 OOP 最佳实践(对象)、数据库最佳实践(关系)而不是混合它们之间的概念(这就是名称 stands for 的映射部分)。

一些 ORM 在遵循这一点上比其他的更好。提示: NHibernate .

关于c# - 我的实体模型中应该有外键列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620506/

相关文章:

nhibernate - NHibernate 工具

nhibernate - 如何使用接口(interface)将 composite-id 映射到流利的 nhibernate?

NHibernate一对多关系中的删除问题

c# - 帮助 QueryOver 和 WhereExists

c# - 使用动态属性搜索 LINQ 中的 Where 子句

wcf - NHibernate Session 在每次 wcf 服务方法调用时被释放

c# - 在 C# 中隐藏/显示 Windows 窗体面板

sql-server-2005 - NHIbernate SysCache2 和 SQLDependency 问题

c# - 等待的任务以取消状态结束不会抛出

c# - 展平 IEnumerable<string> - SelectMany 问题