2010-04-01 67 views
2

我正在工作瓦特/一个旧数据库设置 愚蠢 分别由一个字符id列和两个字符列构成一个日期和时间组成的索引。我为日期和时间列创建了一个ICompositeUserType,以映射到我的实体上的一个.NET DateTime属性,该属性在不是ID的一部分时自行工作。我需要以某种方式使用具有关键属性映射的复合ID,其中包括我的ICompositeUserType,以映射到两个字符日期和时间列。显然瓦特/我的版本功能NHibernate的,CompositeIdentityPart没有一个CustomTypeIs()方法,所以我不能只是做我重写以下:如何使用Fluent NHibernate将复合标识映射到复合用户类型?

mapping.UseCompositeId() 
    .WithKeyProperty(x => x.Id, CommonDatabaseFieldNames.Id) 
    .WithKeyProperty(x => x.FileCreationDateTime) 
    .CustomTypeIs<FileCreationDateTimeType>(); 

是这样的,甚至可能瓦特/ NHibernate的更不用说流利?我一直无法找到任何这方面的信息。

UPDATE:

更加仔细阅读NHibernate的documentation后,我发现NHibernate的不支持component composite IDs,但它并不像它支持自定义类型(即IUserTypeICompositeUserType)复合的ID。此外,我的Fluent版本不支持NHibernate对组件ID的支持(请参阅issue 387issue 346)。我可能会尝试升级我的整个解决方案,看看它是否有效,并发布一个答案,如果它的确如此......除非有人能告诉我没有我必须这样做...... 8o)

回答

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); 
0

尝试添加该

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

虽然我不知道在一次指两列的时候什么意义呢CustomSqlType。可能没有。你能创建一个视图,将这些列投影到正常的DateTime吗?

+0

不幸的是,我根本无法修改数据库。如果取决于我,我们会完全重新设计这个东西。那么你的代码示例依赖于你所建议的视图,还是可以在没有视图的情况下完成? – gabe 2010-04-04 22:41:03

+1

没有看法。对它进行实验,有时最好的方法是了解如果可以用Fluent来完成某些事情,那就是下载源代码并查看单元测试。虽然,我认为你应该将每一列映射到自己的领域,并提供结合它们的附加属性。 – 2010-04-05 02:45:13

+0

检查UTs的好主意。 关于在使用icompositeusertype的映射中组合字段的好处是,我不必在我的域对象中包含遗留的数据库数据访问格式转换,它应该只包含业务逻辑。我对数据访问翻译和POCO类业务逻辑有着分离的关注。如果可以的话,我试图保持这种抽象。我不能将此标记为答案,因为CompositeIdentityPart不包含Columns属性。我需要将FileCreationDateTime分解为组合键/ ID。 – gabe 2010-04-05 14:02:50

相关问题