Fluent NHibernate自动映射List<string>的方法?

12

Fluent NHibernate不喜欢这样,会抛出一个错误:

{"关联引用了未映射的类:System.String"}

好的,我能理解为什么会出现问题 - 但最好的解决方案是什么呢?

我真的不想在单个字段中存储一系列字符串的分隔列表,如果我的列表包含许多字符串,这将变得很丑陋。

出于明显的原因,我也不想要一个“字符串”表。

我想我可以通过将我的 List<string> 包装在一个类中来解决这个问题,但这感觉有点笨重。虽然我开始认为这是最好的解决方案。

什么是最佳方法来处理这个问题?

我完全希望这些值存储在另一个表中。我想也许我可以设置一些自动映射约定,指示NHibernate“如果您看到包含 List<*某些原始类型*>类X,那么请继续自动创建引用表,该表映射到此集合。

感觉在每个集合上都进行包装有点繁琐。但是,如果这是最好的解决方案,那就这样吧。


1
如果您不想将其作为分隔字符串放在单个字段中,也不想将其放在另一个表中,那么在哪里呢?这仍然是关系型数据库... - Mauricio Scheffer
我并不关心关系型数据库如何处理这个问题。我想知道如何让自动映射推断出这是我想要在我的领域模型中为所有字符串列表执行的操作。 - Alex
@Alex - 据我所知,目前没有办法告诉Fluent NHibernate如何映射所有的字符串列表。我在我的回答中提供的解决方案需要为域模型中的每个字符串列表进行覆盖。每个覆盖只需要几行代码,所以还算不错... - Tom Bushell
我今天遇到了这个问题,并找到了一个更简单的解决方案(使用一个国家代码列表的区域): HasMany(x => x.Countries).KeyColumn("CNTRY_REGION_CD").Element("value"); - Joseph Yaduvanshi
3个回答

7

几周前,我遇到了完全相同的问题,只不过使用的是浮点数而非字符串。

如何使用Fluent NHibernate自动映射List<float>或float?

事实证明,Automapping不能处理原始类型。

编辑 - 这已经不再是真的了 - FNH团队已经解决了这个问题

在我的问题的被接受答案中有很多示例代码,但关键点是为原始类型的列表添加一个重载(在下面的示例中为“RawY”):

public class DlsAppOverlordExportRunData
{
    public virtual int Id { get; set; }
    // Note: List<float> needs overrides in order to be mapped by NHibernate.
    // See class DlsAppOverlordExportRunDataMap.
    public virtual IList<float> RawY { get; set; }
}


// Must be in different namespace from DlsAppOverlordExportRunData!!!
public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData>
{
    public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping)
    {
        // Creates table called "RawY", with primary key
        // "DlsAppOverlordExportRunData_Id", and numeric column "Value"
        mapping.HasMany(x => x.RawY)
               .Element("Value");
    }
}

我认为相同的方法也适用于字符串列表(ILists of strings)。

好的,这看起来很有趣。这是可以通过约定来定义的东西吗?似乎FNH正在专注于使用约定来自定义自动映射。 - Alex
我不这么认为。我通过在流利邮件列表上提问获得了解决方案,并相信其中一位FNH作者给了我答案。如果可以通过单个约定完成,我认为他会建议这样做。 - Tom Bushell

4

自从我发表了我的第一个回答后,Fluent NHibernate 团队已经解决了这个问题。

现在,您可以自动映射C#值类型(例如字符串、整数、浮点数等)的IList。

只需确保您拥有最新版本的FNH即可。


唉,这对我的需求来说几乎晚了一年 - 不过很高兴看到FNH实现了这一点,这是我在使用它进行大型LOB应用程序时遇到的唯一真正障碍。 - Alex
赞扬Tom一年后回来提供这个更新。 - MushinNoShin

1
想象一下...如果没有Hibernate,你会怎么做呢?嗯,你可能会有一个带有外键和字符串列的表格?那么,如何使用Hibernate实现呢?你需要设置另一个类,其中包含多对一和字符串属性。然后你映射该类的集合。

好的,我明白了。我只是不喜欢创建所有这些完全琐碎的类来包装原始集合。我能让自动映射为我推断这一点吗? - Alex
哦,那你不需要创建另一个类吗?我认为这是可能的...看看他们给出了一个整数集合的例子,似乎你只需创建一个普通的集合,然后为你的字符串定义一个元素属性即可。请参考http://nhforge.org/doc/nh/cn/index.html#collections-of-values。 - dotjoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接