FluentNHibernate 中的 Mutable NaturalId 修改时会抛出异常

发布于 2024-09-15 01:42:53 字数 1389 浏览 5 评论 0原文

我有一个带有代理 ID 的实体和一个使用 FluentNHibernate 映射的复合 NaturalId。我使自然 id 可变,将其标记为“Not.ReadOnly()”。类似于:

    public class EntityMap: ClassMap<Entity>
    {
        public EntityMap()
        {
            Id(x => x.Id);

            NaturalId().Not.ReadOnly()
                .Reference(x => x.OtherEntity, "OtherEntityId")
                .Property(x => x.IntegerProperty);

            // more fields
        }
   }

生成的 xml 类似于:

 <natural-id mutable="true">
      <property name="IntegerProperty" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="IntegerProperty" />
      </property>
      <many-to-one class="OtherEntity, OtherEntity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="OtherEntity">
        <column name="OtherEntityId" />
      </many-to-one>
    </natural-id>

如果我更改 OtherEntity,操作会正常工作并且实体会在数据库中更新。如果我更改 IntegerPropery,则会出现异常:“Namespace.Entity 实例的不可变自然标识符已更改”。

如果它被标记为 mutable="true",为什么它会抱怨“不可变的自然标识符”?

代码是这样的:

using (var session = SessionManager.OpenSession())
using (var tran = session.BeginTransaction())
{
   session.Update(entity);

   entity.IntegerProperty = (int)differentValue;

   tran.Commit();
}

谢谢

I have an entity with a surrogate Id and a composite NaturalId mapped with FluentNHibernate. I make the natural id mutable marking it "Not.ReadOnly()". Something like:

    public class EntityMap: ClassMap<Entity>
    {
        public EntityMap()
        {
            Id(x => x.Id);

            NaturalId().Not.ReadOnly()
                .Reference(x => x.OtherEntity, "OtherEntityId")
                .Property(x => x.IntegerProperty);

            // more fields
        }
   }

The generated xml is like:

 <natural-id mutable="true">
      <property name="IntegerProperty" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="IntegerProperty" />
      </property>
      <many-to-one class="OtherEntity, OtherEntity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="OtherEntity">
        <column name="OtherEntityId" />
      </many-to-one>
    </natural-id>

If I change OtherEntity, the operation works fine and the entity is updated in the database. If I change IntegerPropery, I get the exception: "immutable natural identifier of an instance of Namespace.Entity was altered".

Why is it complaining about the "immutable natural identifier" if it is marked as mutable="true"?

The code is something like:

using (var session = SessionManager.OpenSession())
using (var tran = session.BeginTransaction())
{
   session.Update(entity);

   entity.IntegerProperty = (int)differentValue;

   tran.Commit();
}

Thanks

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

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

发布评论

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

评论(1

不忘初心 2024-09-22 01:42:53

默认情况下,属性为 .Not.ReadOnly

它是自然 ID,默认情况下是不可变的。

对于 XML 映射,您必须指定 mutable="true"。在 Fluent 中寻找类似的东西(我不确定是否支持)

Properties are .Not.ReadOnly by default.

It's the natural id which is non-mutable by default.

With XML mappings, you'd have to specify mutable="true". Look for something similar in Fluent (I'm not sure if it's supported)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文