流利的NHibernate:“…”;。。。当在内存中创建新对象时,它';s标识字段未定义";
是否有人知道如何创建对象,使其在其标识字段中具有某些内容-以便我可以使用它来获取哈希代码 一个选项是使用Guid作为id。这样您就不需要数据库往返来获取标识值流利的NHibernate:“…”;。。。当在内存中创建新对象时,它';s标识字段未定义";,nhibernate,fluent-nhibernate,fluent,Nhibernate,Fluent Nhibernate,Fluent,是否有人知道如何创建对象,使其在其标识字段中具有某些内容-以便我可以使用它来获取哈希代码 一个选项是使用Guid作为id。这样您就不需要数据库往返来获取标识值 <id name="_id" column="PersonId" > <generator class="assigned" /> </id> 如果使用SQL Server,“PersonId”列类型应为。然后,当您创建对象时,可以使用该对象生成新id public c
<id name="_id" column="PersonId" >
<generator class="assigned" />
</id>
如果使用SQL Server,“PersonId”列类型应为。然后,当您创建对象时,可以使用该对象生成新id
public class Person {
private Guid _id;
public Person() {
_id = Guid.NewGuid();
}
public Guid Id {
get { return _id; }
}
}
这种方法的优点是,您的代码与数据库更加解耦。在测试期间,如果您需要支持“断开连接”的场景,这将非常有用。潜在的缺点是连接期间的性能(google“guid vs int主键”)。有关NHibernate中id生成器的更多信息,请参阅
作为补充说明,您可能希望使用业务密钥设计和实现您的应用程序。在这种情况下,您不需要Guid标识。发件人:
“我们建议使用业务密钥实现equals()和hashCode()
相等。业务键相等意味着equals()方法
仅比较构成业务密钥的属性,该密钥
将在现实世界中识别我们的实例(一个自然的候选者
键)”(Hibernate参考文档第3.1.1节)
嗯,这取决于您希望实现哪种并发性以及您的工作单元有多长。。虽然GUId ID和HILO ID在大多数情况下听起来都很花哨和酷,但它们并不是必需的 关于您的问题,您需要在数据库上保存要生成的id,前提是该id是由db生成的自动递增id,这可能会在提交事务之前暂时锁定该表,但这是具有自动递增id的缺点之一 还有一件事,为什么要保存对象并将其与其他对象进行比较?它必须具有不同的id 假设学生是您的班级,具有两个属性Id、名称、学校
现在,如果您想知道是不是同一个学生,那么您可能希望在姓名和学校而不是Id上生成哈希值,谢谢。Stackoverflow和它的用户从未停止给我留下深刻的印象。是的,现在我正在考虑在对象构造函数中从字段创建一个常识键。
public class Person {
private Guid _id;
public Person() {
_id = Guid.NewGuid();
}
public Guid Id {
get { return _id; }
}
}