我正在使用遗留数据库设置 stupidly ,其索引由char id列和两个char列组成,分别构成日期和时间。我为日期和时间列创建了一个ICompositeUserType
,以映射到我的实体上的单个.NET DateTime
属性,该属性在不属于id时自行运行。我需要以某种方式使用具有键属性映射的复合id,其中包含我的ICompositeUserType
以映射到两个char日期和时间列。显然,我的Fluent NHibernate版本CompositeIdentityPart
没有CustomTypeIs()
方法,所以我不能在我的覆盖中执行以下操作:
mapping.UseCompositeId()
.WithKeyProperty(x => x.Id, CommonDatabaseFieldNames.Id)
.WithKeyProperty(x => x.FileCreationDateTime)
.CustomTypeIs<FileCreationDateTimeType>();
是这样的,甚至可能是NHibernate,更不用说Fluent了?我无法找到任何相关内容。
更新:
在仔细阅读NHibernate documentation之后,我发现NHibernate支持component composite IDs,但它看起来不支持自定义类型(即IUserType
和{{1对于复合ID。此外,我对Fluent的版本不支持NHibernate对组合复合ID的支持(参见issue 387和issue 346)。我可能会尝试升级我的整个解决方案,看看它是否有效,如果确实发布了自己问题的答案......除非有人能告诉我我不得不这样做... 8o)
答案 0 :(得分:0)
尝试添加此
mapping.Map(x => x.FileCreationDateTime).Columns.Add("FileCreationDate", "FileCreationTime").CustomSqlType("YourType");
虽然我不确定CustomSqlType在同时引用两列时有什么意义。可能没有。你能创建一个视图,将这些列投影到正常的DateTime列吗?
答案 1 :(得分:0)
NHibernate不支持将IUserType
或ICompositeUserTypes
用于复合ID。但它确实支持组件复合ID,但Fluent NHibernate对此的支持有限。从我在源代码中看到的内容来看,它不允许您为NHibernate允许的组件属性指定列名。我现在不得不放弃,只创建两个string
字段,数据库中的两个string
日期字段可以单独映射,然后有一个DateTime?
属性来翻译两个string
属性。倾向于HeavyWave的评论:“虽然,我认为你应该只将每一列映射到它自己的字段,并提供组合它们的附加属性。”
mapping.CompositeId()
.KeyProperty(x => x.Id, CommonDatabaseFieldNames.Id)
.KeyProperty(x => x.FileCreationDateString, CommonDatabaseFieldNames.FileCreationDate)
.KeyProperty(x => x.FileCreationTimeString, CommonDatabaseFieldNames.FileCreationTime);