C#学习教程:使用Fluent NHibernate将List 映射到分隔的字符串分享


使用Fluent NHibernate将List 映射到分隔的字符串

我的模型看起来像这样:

public class Product { public string Name {get; set;} public string Description {get; set;} public double Price {get; set;} public List Features {get; set;} } 

我希望我的数据库表是平的 – 列表应该存储为分隔字符串:function一|function二|function三例如。

从db中检索时,它应将每个项目放回List中

这可能吗?

我在我当前的项目中做了同样的事情,只是我坚持将枚举的集合作为管道分隔的数字。 它的工作方式相同。

 public class Product { protected string _features; //this is where we'll store the pipe-delimited string public List Features { get { if(string.IsNullOrEmpty(_features) return new List(); return _features.Split(new[]{"|"}, StringSplitOptions.None).ToList(); } set { _features = string.Join("|",value); } } } public class ProductMapping : ClassMap { protected ProductMapping() { Map(x => x.Features).CustomType(typeof(string)).Access.CamelCaseField(Prefix.Underscore); } } 

我为MySql set数据类型实现了类似的东西,它是db中逗号分隔的列表,但是实体模型中的字符串列表。 它涉及在NHibernate中使用基于PrimitiveType类的自定义数据类型。 您可以在地图上使用映射和.CustomType ()方法进行连接。

如果你愿意,我可以为你发送自定义类的代码snipet。

我还为Point3D结构实现了类似的东西。 正如cdmdotnet所说,你基本上想要实现和IUserType,它将通过NullSafeSet / NullSafeGet方法将function打包/解压缩为单个字符串。

您可能还需要实现Equals()方法,这有点微妙。 最好通过一个例子说明原因:

  Product p = session.Load(...); p.Features.Add("extra feature"); session.Save(p); 

问题是,NHibernate on hydration存储对p.Features的引用,并在保存请求时将其与p.Features的值进行比较。 对于不可变属性类型,这很好,但在上面的示例中,这些引用是相同的,因此有效的比较是

 var x = p.Features; var changed = Equals(x, x); 

显然,这个的标准实现总是返回false。

怎么应该处理这个? 我不知道最佳做法是什么,但解决方案是:

如果您有NHibernate的一些经验,我希望这可以帮助您入门。 如果不让我知道,我会尝试将更详细的解决方案放在一起。

上述就是C#学习教程:使用Fluent NHibernate将List 映射到分隔的字符串分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/959762.html

发表评论

邮箱地址不会被公开。 必填项已用*标注