如何使用Fluent NHibernate将复合id映射到复合用户类型?

时间:2010-04-01 19:57:59

标签: nhibernate fluent-nhibernate nhibernate-mapping legacy

我正在使用遗留数据库设置 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 387issue 346)。我可能会尝试升级我的整个解决方案,看看它是否有效,如果确实发布了自己问题的答案......除非有人能告诉我我不得不这样做... 8o)

2 个答案:

答案 0 :(得分:0)

尝试添加此

mapping.Map(x => x.FileCreationDateTime).Columns.Add("FileCreationDate", "FileCreationTime").CustomSqlType("YourType");

虽然我不确定CustomSqlType在同时引用两列时有什么意义。可能没有。你能创建一个视图,将这些列投影到正常的DateTime列吗?

答案 1 :(得分:0)

NHibernate不支持将IUserTypeICompositeUserTypes用于复合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);