我正在使用旧数据库,并且正在尝试使用 Fluent NHibernate 映射某种本地化表。
该表如下所示:
DataName
[PK] TableName
[PK] FieldName
[PK] Id
[PK] LangId
Description
此表通过此实体映射:
公共类 DataName : EntityBase { 公共虚拟字符串表名 { 获取;放; } 公共虚拟字符串字段名 { 获取;放; } 公共虚拟 int Id { 获取;放; } 公共虚拟语言语言{get; 放; } 公共虚拟字符串描述{get; 放; } ... } 公共类 DataNameMap : ClassMap { 公共数据名称映射() { 表(“zDataName”); CompositeId().KeyProperty(x => x.TableName) .KeyProperty(x => x.FieldName) .KeyProperty(x => x.Id) .KeyProperty(x => x.Language, "LangId").CustomType(); Map(x => x.Description).Column("Descr").Length(2000); } }
为了本地化,我有多个实体映射到“DataName”实体,映射如下所示:
公共类运营商 { 公共虚拟 int CarrId { 获取;放; } 公共虚拟字符串 CarrCode { get; 放; } 公共虚拟列表 DataNameList { 获取;放; } ... } 公共类 CarrierMap : ClassMap { 公共运营商地图() { 表(“运营商”); Id(x => x.CarrId).GeneratedBy.Identity(); Map(x => x.CarrCode).Not.Nullable().Length(8); HasMany(x => x.DataNameList) .KeyColumn("Id") .Where("TableName = 'carriers' AND FieldName = 'name'") 。逆() .Cascade.AllDeleteOrphan(); ... } }
“DataName”表包含如下所示的记录:
表名 字段名 Id LangId 描述 --------- --------- -- ------ ------------ 运营商名称 1000 1 英文描述 运营商名称 1000 2 法语描述
我可以毫无问题地从数据库中检索这些信息,但是当需要将新实体(插入或更新)保存到数据库时,NHibernate 不会以正确的顺序执行操作。
INSERT INTO DataName (TableName, FieldName, LangId, Id, Description) VALUES ('Carriers', 'Name', 1, NULL, 'English description') INSERT INTO DataName (TableName, FieldName, LangId, Id, Description) VALUES ('Carriers', 'Name', 2, NULL, 'French description') 插入载体....
就本例而言,假设数据库生成的 id 为 2000。
更新数据名称集 ID = 2000 WHERE TableName = 'Carriers' AND FieldName = 'Name' AND LangId = 1 AND Id IS NULL 更新数据名称集 ID = 2000 WHERE TableName = 'Carriers' AND FieldName = 'Name' AND LangId = 2 AND Id IS NULL
我曾尝试使用 DataNameList 集合的 HasMany 映射的 Inverse() 选项,但它似乎对这种特殊情况没有任何影响。
如何告诉 NHibernate 持久化“Carrier”实体,然后收集“DataName”,而无需在插入“Carrier”实体后发出额外的 UPDATE 语句?