为什么Id使用NHibernate从1改为1

时间:2010-09-22 13:43:46

标签: nhibernate

我有这样的映射

<class name="UserFileSummary" table="UserFile" lazy="false">
   <id name="FileId" column="UserFileId" type="int">
      <generator class="identity" />
   </id>...

和c#对象中的属性一样

public long FileId { get; set; }

我不明白为什么当我使用

获取实例时
var myFile = session.Get<UserFileSummary>(id)

更改字段值,然后像这样保存

myFile.myProperty = newValue
session.Save(myFile)

我收到一条错误,说明Id已从1更改为1.此处有一些帖子,但这是一个简单的int列(标识1,1)。我一定是犯了一些基本错误,请任何人帮忙。感谢

我已将此位添加为编辑,因为问题原来是一个非问题

  

FileId属性是long类型,映射是int类型,这就是从1改为1的原因。

如果您要我删除此问题,请给我一些反馈,谢谢大家:)

3 个答案:

答案 0 :(得分:4)

我可以从您的代码中指出的唯一一点是使用Save来更新现有实体。

您可以避免为会话中存在的实体显式调用Save方法。刷新会话时,您的更改将自动保留。

如果您坚持要明确调用更新方法,我会说您应该使用SaveOrUpdate

答案 1 :(得分:1)

首先,将属性的setter设为私有;如果您有任何错误设置的代码,项目将无法编译。无论如何,这是一个很好的做法。但它不是万无一失的,因为类中可能有代码设置它,所以你必须检查它。

public int FileId { get; private set; }

其次,仔细检查映射文件,确保没有两次映射字段。

答案 2 :(得分:1)

我的错误是由于数据类型在数据库中是long(int64)并且映射到映射中的int(int32)。这意味着无论何时保存对象,实际值都会更改,从而破坏标识符。感谢所有帮助过的人。