在城堡活动记录中,为什么当我的会话作用域应该结束时我必须使用 CreateAndFlush?

发布于 2025-01-04 12:32:31 字数 651 浏览 0 评论 0原文

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

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

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

如果我调用 .CreateAndFlush() 而不是 Create(),实体将保留到数据库。我认为当会话范围结束时,Create() 中的更改将被保留。他们为什么不...我是否误解了这应该如何运作?

I have a very simple asp.net mvc web app which uses castle active record, on top of MySql.

The users of the app want to now define the primary key for one of the entities manually (it was the default of autonumber). No problem I thought, I will simple change the primary key attribute from [PrimaryKey] to [PrimaryKey (PrimaryKeyType.Assigned)] and modify the database schema (okay I know this could be considered a flawed approach but that is not the point of this question)

After trying this, new entities would never get persisted to the database when calling their .Create() method, even though I create a sessionscope per request in OnBeginRequest and OnEndRequest using code identical to here. The same code worked fine before I altered the [Primary Key] attribute.

If I call .CreateAndFlush() instead of Create(), the entities are persisted to the db. I thought the changes in Create() would be persisted when the sessionscope ends. Why aren't they... am I misunderstanding how this should work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝戈者 2025-01-11 12:32:31

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

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

问候语
朱伊·朱卡

For a generated Key ActiveRecord knows that 0/NULL/{0000-0000-0000-0000}/etc. are the empyt values and that the object is transient and needs to be created. It does not know it the PrimaryKey is Assigened. But you can tell ActiveRecord what the empty value is, just use the following named parameter for your PrimaryKeyAttribute.

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

Greeetings
Juy Juka

南笙 2025-01-11 12:32:31

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

从中吸取的两个教训:

  1. 下次在 SO 上发布我的代码。
  2. 不要在深夜进行代码更改,否则我可能会忘记......

Turned out to be pebcak. I had forgotten that I'd written some code which checks that the new primary key does not exist. That code of course needed its own sessionscope. As soon as I did that everything worked, i.e. calling .create would persist the object to the DB.

Two lessons learned from this:

  1. Next time post my code on SO.
  2. Don't make late night code changes that I may otherwise forget about...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文