我有一个非常简单的asp.net mvc网络应用程序,它使用城堡活动记录,在MySql之上。
应用程序的用户现在想要手动为其中一个实体定义主键(这是默认的autonumber)。没问题我想,我会简单地将主键属性从[PrimaryKey]
更改为[PrimaryKey (PrimaryKeyType.Assigned)]
并修改数据库模式(好吧我知道这可能被认为是一个有缺陷的方法,但这不是这个问题的重点)
尝试此操作后,即使我使用与here相同的代码在OnBeginRequest和OnEndRequest中为每个请求创建一个会话范围,新实体也不会在调用其.Create()
方法时持久保存到数据库中。在我更改[Primary Key]
属性之前,相同的代码工作正常。
如果我调用.CreateAndFlush()而不是Create(),则实体将持久保存到db。我认为当sessioncope结束时,Create()中的更改将保持不变。他们为什么不......我误解了这应该如何运作?
答案 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。
从中吸取了两个教训: