我有这样的映射
<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的原因。
如果您要我删除此问题,请给我一些反馈,谢谢大家:)
答案 0 :(得分:4)
我可以从您的代码中指出的唯一一点是使用Save
来更新现有实体。
您可以避免为会话中存在的实体显式调用Save方法。刷新会话时,您的更改将自动保留。
如果您坚持要明确调用更新方法,我会说您应该使用SaveOrUpdate
。
答案 1 :(得分:1)
首先,将属性的setter设为私有;如果您有任何错误设置的代码,项目将无法编译。无论如何,这是一个很好的做法。但它不是万无一失的,因为类中可能有代码设置它,所以你必须检查它。
public int FileId { get; private set; }
其次,仔细检查映射文件,确保没有两次映射字段。
答案 2 :(得分:1)
我的错误是由于数据类型在数据库中是long(int64)并且映射到映射中的int(int32)。这意味着无论何时保存对象,实际值都会更改,从而破坏标识符。感谢所有帮助过的人。