在城堡活动记录中,为什么我的会话范围应该结束时我必须使用WriteAndFlush?

时间:2012-02-13 00:18:45

标签: nhibernate asp.net-mvc-2 castle-activerecord

我有一个非常简单的asp.net mvc网络应用程序,它使用城堡活动记录,在MySql之上。

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

尝试此操作后,即使我使用与here相同的代码在OnBeginRequest和OnEndRequest中为每个请求创建一个会话范围,新实体也不会在调用其.Create()方法时持久保存到数据库中。在我更改[Primary Key]属性之前,相同的代码工作正常。

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

2 个答案:

答案 0 :(得分:1)

对于生成的Key ActiveRecord,知道0 / NULL / {0000-0000-0000-0000} / etc。是empyt值,对象是瞬态的,需要创建。它不知道PrimaryKey是Assigened。但是你可以告诉ActiveRecord空值是什么,只需为你的PrimaryKeyAttribute使用以下命名参数。

[PrimaryKey(PrimaryKeyType.Assigned, UnsavedValue="")]

Greeetings Juy Juka

答案 1 :(得分:0)

原来是pebcak。我忘记了我写了一些代码来检查新的主键是不存在的。该代码当然需要自己的会话镜。一旦我这样做,一切正常,即调用.create会将对象持久保存到DB。

从中吸取了两个教训:

  1. 下次将我的代码发布到SO。
  2. 不要让我可能忘记的深夜代码更改......