Nhibernate 在castle active record中,当会话范围应该结束时,为什么必须使用CreateAndFlush?

Nhibernate 在castle active record中,当会话范围应该结束时,为什么必须使用CreateAndFlush?,nhibernate,asp.net-mvc-2,castle-activerecord,Nhibernate,Asp.net Mvc 2,Castle Activerecord,我有一个非常简单的asp.net mvc web应用程序,它在MySql之上使用castle active record 应用程序的用户现在希望手动定义其中一个实体的主键(这是autonumber的默认值)。我想没问题,我将简单地将主键属性从[PrimaryKey]更改为[PrimaryKey(PrimaryKeyType.Assigned)],并修改数据库模式(好的,我知道这可能被认为是一种有缺陷的方法,但这不是问题的重点) 尝试此操作后,在调用其.Create()方法时,新实体将永远不会持久

我有一个非常简单的asp.net mvc web应用程序,它在MySql之上使用castle active record

应用程序的用户现在希望手动定义其中一个实体的主键(这是autonumber的默认值)。我想没问题,我将简单地将主键属性从
[PrimaryKey]
更改为
[PrimaryKey(PrimaryKeyType.Assigned)]
,并修改数据库模式(好的,我知道这可能被认为是一种有缺陷的方法,但这不是问题的重点)

尝试此操作后,在调用其
.Create()
方法时,新实体将永远不会持久化到数据库,即使我使用与相同的代码在OnBeginRequest和OnEndRequest中为每个请求创建sessionscope。在我更改
[Primary Key]
属性之前,相同的代码运行良好


如果调用.CreateAndFlush()而不是Create(),则实体将持久化到db。我认为Create()中的更改会在sessionscope结束时保持不变。为什么他们不。。。我是否误解了这应该如何工作?

对于生成的密钥,ActiveRecord知道0/NULL/{0000-0000-0000-0000}/etc.是empyt值,并且对象是瞬态的,需要创建。它不知道主钥匙被分配了。但是您可以告诉ActiveRecord空值是什么,只需为PrimaryKeyAttribute使用以下命名参数

[PrimaryKey(PrimaryKeyType.Assigned, UnsavedValue="")]
问候
对于生成的密钥ActiveRecord,Juy Juka

知道0/NULL/{0000-0000-0000-0000}/etc.是empyt值,并且对象是瞬态的,需要创建。它不知道主钥匙被分配了。但是您可以告诉ActiveRecord空值是什么,只需为PrimaryKeyAttribute使用以下命名参数

[PrimaryKey(PrimaryKeyType.Assigned, UnsavedValue="")]
问候
Juy Juka原来是pebcak。我忘了我写了一些代码来检查新的主键是否不存在。该代码当然需要自己的会话范围。只要我完成了所有工作,即调用.create就会将对象持久化到DB

从中吸取的两个教训:

  • 下次把我的代码贴在上面
  • 不要在深夜更改代码,否则我可能会忘记

  • 原来是pebcak。我忘了我写了一些代码来检查新的主键是否不存在。该代码当然需要自己的会话范围。只要我完成了所有工作,即调用.create就会将对象持久化到DB

    从中吸取的两个教训:

  • 下次把我的代码贴在上面
  • 不要在深夜更改代码,否则我可能会忘记

  • 啊,这是有道理的。但是我的主键是一个Int,它在对象的新实例上的默认值是零。AR应该知道0是空的吗?我尝试了
    [PrimaryKey(PrimaryKeyType.Assigned,UnsavedValue=“0”)]
    ,但没有什么不同。对象仍然没有保存到数据库中。结果是我的代码出错了+1对于未保存值的信息,这非常有用。啊,这很有意义。但是我的主键是一个Int,它在对象的新实例上的默认值是零。AR应该知道0是空的吗?我尝试了
    [PrimaryKey(PrimaryKeyType.Assigned,UnsavedValue=“0”)]
    ,但没有什么不同。对象仍然没有保存到数据库中。结果是我的代码出错了+1对于未保存值的信息,这非常有用。