代码之家  ›  专栏  ›  技术社区  ›  Mark Dickinson

为什么使用NHibernate将Id从1变为1

  •  1
  • Mark Dickinson  · 技术社区  · 14 年前

    我有一张这样的地图

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

    public long FileId { get; set; }
    

    我不明白的是为什么当我使用

    var myFile = session.Get<UserFileSummary>(id)
    

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

    myFile.myProperty = newValue
    session.Save(myFile)
    

    FileId属性是long类型,映射是int类型,这就是为什么从1改为1是个问题。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Claudio Redi    14 年前

    我唯一能从你的代码中指出的就是 Save 用于更新现有实体。

    如果您坚持显式调用update方法,我会说您应该使用 SaveOrUpdate .

        2
  •  1
  •   Jamie Ide    14 年前

    首先,将属性上的setter设置为私有的;如果您有任何错误设置它的代码,那么项目将无法编译。不管怎样,这是一个很好的做法。但这并不是万无一失的,因为类中可能存在设置它的代码,所以您必须对此进行检查。

    public int FileId { get; private set; }
    

        3
  •  1
  •   Mark Dickinson    11 年前

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