需要NHibernate ID Column吗?

时间:2012-09-17 12:48:45

标签: c# nhibernate

我仍然对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可以保存到DB中。 但也有可能产生这样的客户:

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;
    }
}

那会有用吗? Mapping文件将如何显示?

1 个答案:

答案 0 :(得分:2)

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

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

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

要解决问题:你能想到一个类设计会阻止ID的设置而不会影响NHibernate提供的其他功能吗?