使用NHibernate将数据库中JSON编码的字符串映射到我的对象上的Dictionary属性

使用NHibernate将数据库中JSON编码的字符串映射到我的对象上的Dictionary属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个对象,它维护一个包含各种属性的属性包。这通过我的对象模型以字典的形式公开,并以JSON编码字符串的形式存储在数据库中 使用Fluent NHibernate映射此类的最佳方法是什么 选项1:映射到私有字段,在我的对象中进行JSON转换吗? 我是否应该将属性映射到私有的字符串字段,然后在对象本身中对JSON进行序列化 赞成:NH只需要知道如何将一个字符串映射到一个文本列,这似乎很容易 缺点:为了支持持久性,我的模型必须跟踪字典和字符串 选项2:使用某种拦截器? 我以前没有使用过NH拦截器,

我有一个对象,它维护一个包含各种属性的属性包。这通过我的对象模型以
字典的形式公开,并以JSON编码字符串的形式存储在数据库中

使用Fluent NHibernate映射此类的最佳方法是什么

选项1:映射到私有字段,在我的对象中进行JSON转换吗?

我是否应该将属性映射到私有的
字符串
字段,然后在对象本身中对JSON进行序列化

赞成:NH只需要知道如何将一个字符串映射到一个文本列,这似乎很容易

缺点:为了支持持久性,我的模型必须跟踪字典和字符串

选项2:使用某种拦截器?

我以前没有使用过NH拦截器,但我知道它们。我是否可以使用拦截器来执行Dictionary/JSON序列化,这样我的模型只需要知道Dictionary

选项3:使用不同的编码策略?


除了JSON之外,NH是否还有一种本机支持的、我可以用来序列化字典的不同编码策略?

为了将字典存储为单个编码列,请使用
IUserType
。您可以使用IUserType将字典映射为属性。这是一个实现IUserType的好例子

Map( x => x.JsonDictionary )
    .CustomTypeIs<MyUserType>();
Map(x=>x.JsonDictionary)
.CustomTypeIs();
您还可以将其映射为值的集合。这允许从字典中查询单个值

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>()
    );
HasMany(x=>x.JsonDictionary)
.WithTableName(“实体名称”)
.KeyColumnNames.Add(“entityid”)
.Cascade.All()
.AsMap(
index=>index.WithColumn(“name”).WithType(),
element=>element.WithColumn(“值”).WithType()
);

@Lachlan:我不需要查询单个属性,所以最好只将它们存储在单个文本字段中。您是否会创建一个名称/值表,即使这些对除了作为此属性包的一部分之外永远不会被引用?@Lachlan:我认为CustomType可能会起作用。根据(),看起来我只需要创建一个带有一些特殊方法的
jsonecodeddictionary
类。。。我喜欢这种方法,因为它使序列化代码远离域对象。谢谢@Seth如果您不需要查询单个名称/值,那么编码列就是您想要的。