我的任务是使用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中执行此操作,只要它不违反主键约束的唯一性。
如果有任何人有任何解决方案或途径可供探索,我们将不胜感激。
答案 0 :(得分:0)
对此的更新:
由于没有找到通过NHibernate更新复合主键的方法,我决定考虑添加一个新的并删除现有的。虽然起初我遇到了这方面的问题,但我遵循了this问题答案的建议,特别是定义映射的编辑。
在外键引用上使用Not.Update()和Not.Insert()允许我创建新行并删除旧行,从而对外键执行一种伪更新。