【问题标题】:Updating composite primary keys through NHibernate通过 NHibernate 更新复合主键
【发布时间】:2014-05-12 18:23:35
【问题描述】:

我的任务是使用 Fluent NHibernate 映射一些表,这些表主要用于遗留应用程序,因此无法更改结构。

我遇到的问题似乎与我在 NHibernate 中使用的 CompositeId 映射有关。

以下是表格:

CREATE TABLE [dbo].[tbl_mtng](
    [mtng_cd] [int] IDENTITY(1,1) NOT NULL,
    ...many other columns...
    [mtng_cancelled] [bit] NOT NULL)

主键在 mtng_cd 上定义。

CREATE TABLE [dbo].[tbl_centre](
    [centre_ID] [int] IDENTITY(1,1) NOT NULL,
    ...many other columns...,
    [centre_name] [nvarchar](100) NOT NULL)

主键在 center_ID 上定义。

CREATE TABLE [dbo].[tbl_mtng_centre](
     [mtng_cd] [int] NOT NULL,
     [centre_ID] [int] NOT NULL)

主键定义在 mtng_cd 和 center_ID 上。 (复合键)

以下是 Fluent NHibernate 映射:

对于我的对象中心:

Table("dbo.tbl_centre")
Id(Function(x) x.Id).Column("centre_ID").GeneratedBy().Identity()
HasMany(Of MeetingCentre)(Function(x) x.MeetingCentres).KeyColumn("centre_ID")

对于我的对象会议:

Table("dbo.tbl_mtng")
Id(Function(x) x.Id).Column("mtng_cd").GeneratedBy().Identity()
HasMany(Of MeetingCentre)(Function(x) x.Centres).KeyColumn("mtng_cd")

对于我的对象 MeetingCentre:

Table("dbo.tbl_mtng_centre")
CompositeId().KeyReference(Function(x) x.Centre, "centre_ID").KeyReference(Function(x) x.Meeting, "mtng_cd")

问题出在这里:

当我创建一个简单的子来更新我的一个 MeetingCentre 对象以具有不同的中心(本质上是更新主键的一部分)时,我收到以下错误:

“批量更新从更新中返回了意外的行数;实际行数:0;预期:1”

关于未将 NOCOUNT 设置为 ON 的基础表上的触发器,我之前遇到过此错误,这会干扰 SQL 服务器在运行 NHibernate 的更新/插入后返回的值,但我认为这不是问题所在因为没有一个表定义了触发器。

这就像 NHibernate 不想更新复合主键一样简单吗?因为我可以在 SQL Server 中做到这一点,只要它不违反主键约束的唯一性。

如果有人有任何解决方案或探索途径,将不胜感激。

【问题讨论】:

    标签: vb.net nhibernate fluent-nhibernate


    【解决方案1】:

    关于此的更新:

    由于没有找到通过 NHibernate 更新复合主键的方法,我决定考虑添加一个新主键并删除现有主键。虽然起初我对此有疑问,但我遵循了this 问题的答案的建议,特别是定义映射的编辑。

    在外键引用上使用 Not.Update() 和 Not.Insert() 允许我创建新行并删除旧行,从而对外键执行一种伪更新。

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多