首页 文章

通过NHibernate更新复合主键

提问于
浏览
2

我的任务是使用Fluent NHibernate来映射一些主要用于遗留应用程序的表,因此不能在结构上进行更改 .

我遇到的问题似乎是围绕我在NHibernate中使用的CompositeId映射 .

Here are the tables:

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上定义 . (复合键)

Here are the Fluent NHibernate mappings:

对于我的对象中心:

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

对于我的对象 Session :

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")

Here is the issue:

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

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

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

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

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

1 回答

  • 0

    对此的更新:

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

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

相关问题