我仍然对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文件将如何显示?
答案 0 :(得分:2)
你说这是“NHibernate中的坏类设计”,但是类的设计是这样的。当NHibernate查询数据库并将每一行转换为具体类时,它需要能够将ID
属性设置为数据库给定的值。因此,该值可以设置要求。
还可以将行插入数据库(在大多数数据库引擎中),并暂时禁用标识约束 - 因此 可以提前知道ID。
这是ORM必须克服的(许多!)概念上的困难之一,并且通常存在一些这样的“松散边缘”这一事实表明这些问题有多复杂。
要解决问题:你能想到一个类设计会阻止ID的设置而不会影响NHibernate提供的其他功能吗?