通过NHibernate更新复合主键

时间:2014-05-08 15:33:17

标签: vb.net nhibernate fluent-nhibernate

我的任务是使用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)

主键在centre_ID上定义。

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

主键在BOTH mtng_cd和centre_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")

以下是问题:

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

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

我之前遇到过这样的错误,关于没有NOCOUNT设置为ON的基础表上的触发器在运行NHibernate的更新/插入后干扰了SQL Server返回的值,但我没有&#39 ; t认为这是问题,因为没有一个表定义了触发器。

这是否像NHibernate一样简单,不想更新复合主键?因为我可以在SQL Server中执行此操作,只要它不违反主键约束的唯一性。

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

1 个答案:

答案 0 :(得分:0)

对此的更新:

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

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