1

我对 Nhibernate 还是很陌生,我对 ID 列有疑问。

让我们考虑下类客户:

class customer
{
    public virtual long ID;
    public virtual string Name;

    public customer()
    {

    }

    public customer(string name)
    {
        Name = name;
    }
}

在我定义的映射文件中,正在生成 ID 列。所以我想创建一个新客户:

customer c = new customer("Max Mustermann");

现在一切都好。生成 ID,Max 可以保存到数据库中。但也有可能产生这样的客户:

customer c = new customer() { ID = 3, Name= "Max Mustermann"};

这应该是不可能的,因为我真的不知道客户的 DB-ID(只有他的名字)。此外,我真的不需要我的程序中的 ID,所以我不高兴在我的对象中有 ID。

在我看来,这是 Nhibernate 中一个糟糕的类设计......有没有办法避免这种情况?

谢谢

编辑1:

你是这个意思吗?

class customer
{
    protected virtual long _ID;
    public virtual string Name;

    public virtual long GetID 
    {
        get { return _ID; } 
    }

    public customer()
    {

    }

    public customer(string name)
    {
        Name = name;
    }
}

那行得通吗?映射文件的外观如何?

4

1 回答 1

2

你说这是“NHibernate 中糟糕的类设计”,但类必须这样设计。当 NHibernate 查询您的数据库并将每一行转换为具体类时,它需要能够将ID属性设置为数据库给定的值。因此,需要该值是可设置的。

也可以将行插入数据库(在大多数数据库引擎中),同时暂时禁用身份约束 - 因此可以提前知道 ID。

这是 ORM 必须克服的(许多!)概念上的困难之一,而且经常有一些像这样的“松散边缘”的事实表明这些问题有多复杂。

把问题转过来:你能想出一个类设计来防止 ID 被设置而不损害 NHibernate 提供的其他功能吗?

于 2012-09-17T12:54:30.760 回答