【问题标题】:Is it possible to have a composite id that can be edited in NHibernate?是否可以有一个可以在 NHibernate 中编辑的复合 id?
【发布时间】:2010-06-19 00:54:43
【问题描述】:

我的表中有许多列用作复合主键,

更糟糕的业务逻辑要求这些是可变的。

我正在使用 nhibernate 并且映射加载/保存这些没有问题。但是,当我调用更新时,我需要能够更新属性值并让这些更改反映在数据库中。

这是一个遗留系统,因此数据库结构没有变化(太可怕了)。

我可以用 nhibernate 做些什么来解决这个问题吗? nhibernate 甚至允许修改其密钥。

我正在使用:.net4.0、nhibernate 2.1、fluentnh 1.0 和 sql server 作为后端。

【问题讨论】:

    标签: .net nhibernate composite-key composite-id


    【解决方案1】:

    您无法使用 NHibernate 更改 PK。正如您已经发现的那样,您正在处理的结构非常糟糕。

    您可以做的是使用 SQL 查询来更改 PK。请记住,在再次使用之前,您必须使用新 ID 重新加载实体。

    【讨论】:

    • 我希望我只是缺少一些东西,我可以告诉 nhibernate 如何处理这个 :(。我考虑过使用自定义 sql 来处理更改,但这只是打败了 nh 的紫色。最可悲的是,几乎每个表都有这个设置并且没有代理键。我也有一个很好的域......叹气。我只是要使用 linq2sql 来完成这个工作。感谢 diego 的帮助。跨度>
    【解决方案2】:

    实际上,您没有义务将数据库模式按原样映射到域对象。

    我有一个应用程序,它的对象结构不能真正在数据库上表示,NHibernate 理解语义:它需要一个 3 列的复合 ID,但问题是有些情况下 2 列得到修改的。因此,我将单个列属性映射为 PK,并自动使用其他两个属性,并获得了两全其美。

    请注意,在这些情况下,二级缓存是一个很大的禁忌!

    【讨论】:

    • 我尝试了这种方法,它似乎工作正常。但是,由于那些只有 1 个主键。对实体的更新将向所有行发送更新,而不仅仅是实体真正对应的那一行。所以这将生成 UPDATE accountAccess SET access = 400 WHERE user = 1 而不是 UPDATE accountAccess SET access = 400 WHERE user_id = 1 and accoun_id = 2 首先更新所有用户帐户访问项,这是错误的。第二个是对的。感谢您的帮助。
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多