我有一个维护各种属性的属性包的对象。这通过我的对象模型作为Dictionary<string, string>
公开,并作为JSON编码的字符串存储在数据库中。
使用Fluent NHibernate映射此类的最佳方法是什么?
选项1:映射到私有字段,在我的对象中进行JSON转换?
我应该将属性映射到私有string
字段,然后在对象本身中对JSON进行序列化吗?
Pro:NH只需知道将单个字符串映射到文本列,这似乎很容易。
Con:我的模型必须跟踪字典和字符串,只是为了支持持久性。
选项2:使用某种拦截器?
之前我没有对NH拦截器做过任何事情,但我知道 它们。我可以使用拦截器来执行Dictionary / JSON序列化,这样我的模型只需要知道字典吗?
选项3:使用不同的编码策略?
除了JSON之外,是否存在NH本地支持的编码策略,我可以使用它来序列化我的字典?
答案 0 :(得分:2)
要将词典存储为单个编码列,请使用IUserType
。您可以使用IUserType将字典映射为属性。这个blog post有一个很好的实现IUserType的例子。
Map( x => x.JsonDictionary )
.CustomTypeIs<MyUserType>();
您还可以将其映射为值集合。这允许从字典中查询单个值。
HasMany( x => x.JsonDictionary )
.WithTableName("entity_jsondictionary")
.KeyColumnNames.Add("entityid")
.Cascade.All()
.AsMap<string>(
index => index.WithColumn("name").WithType<string>(),
element => element.WithColumn("value").WithType<string>()
);