流利的NHibernate:“…”;。。。当在内存中创建新对象时,它';s标识字段未定义";

流利的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

是否有人知道如何创建对象,使其在其标识字段中具有某些内容-以便我可以使用它来获取哈希代码

一个选项是使用Guid作为id。这样您就不需要数据库往返来获取标识值

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