NHibernate上值对象的单独表

NHibernate上值对象的单独表,nhibernate,domain-driven-design,entity,value-objects,Nhibernate,Domain Driven Design,Entity,Value Objects,我是DDD和NHibernate的新手 在我当前的项目中,我有一个实体Person,它包含一个value对象,比如Address。今天,这很好。但也许有一天我会要求我的价值对象(在本例中是地址)必须成为一个实体 在尝试以DDD方式对此进行建模之前,我使用了一种更以数据为中心的方法,我有一个表Person,有一个Id,还有另一个表地址,其PK实际上是一个FK,它是Person的Id(即一对一关系) 我一直在读,当我将一个值对象映射为一个组件时,它的值将被映射为实体表上的列(因此,我不会有一对一的关

我是DDD和NHibernate的新手

在我当前的项目中,我有一个实体Person,它包含一个value对象,比如Address。今天,这很好。但也许有一天我会要求我的价值对象(在本例中是地址)必须成为一个实体

在尝试以DDD方式对此进行建模之前,我使用了一种更以数据为中心的方法,我有一个表Person,有一个Id,还有另一个表地址,其PK实际上是一个FK,它是Person的Id(即一对一关系)

我一直在读,当我将一个值对象映射为一个组件时,它的值将被映射为实体表上的列(因此,我不会有一对一的关系)

我的想法是,当需要时,我只需向地址表添加一个代理键,然后它就成为一个实体

我应该如何使用NHibernate设计它?我应该已经将我的地址对象设置为实体吗


对不起,我甚至不知道我的问题是否清楚,我在这里真的迷路了。

在我们正在构建的系统中,我们将值对象放在单独的表中。据我所知,NHibernate要求必须向对象添加
id
,但我们忽略了这一点,将对象视为系统中的值对象。您可能知道,值对象是不需要跟踪的对象,因此我们只需忽略对象中的
id
。这使我们可以更自由地按照我们想要的方式对数据库进行建模,并按照我们想要的方式对域模型进行建模。

您可以加入并使其成为一个组件,允许nHibernate将其映射为适当的值对象,而不是实体

这样,您就不需要任何虚拟属性,也不需要空的受保护的ctor(它可以是私有的)

Join(“提案/产品”,产品=>
{
product.Schema(IsaSchema.PROPOSALOWN);
product.KeyColumn(“建议书编号”);
proposalProduct=>
{
proposalProduct.Map。。。
});
});

这里采用相同的方法。ddd并不要求对象不应该有一个名为id的属性-它只是告诉值对象是没有标识的对象。嗯,创建一个受保护的id,这样我就可以隐藏它了,但NHibernate仍然能够看到并映射它?但最终会在值对象表中重复条目。如何避免它?我怀疑在没有标识符的情况下,NHibernate永远无法判断值对象是暂时的还是持久的(它是否已经在表中?),并且在插入或更新引用值对象的任何实体之前,总是执行额外的
SELECT
查询以进行检查。我选择了受保护的id,以便在这方面提高性能,尽管它在我的干净域对象中引入了持久性问题。
Join("PROPOSAL_PRODUCT", product =>
{
    product.Schema(IsaSchema.PROPOSALOWN);
    product.KeyColumn("PROPOSAL_ID");

    product.Component(Reveal.Member<Proposal, Product>("_product"), proposalProduct =>
    {
        proposalProduct.Map...
    });
});