使用FluentNHibernate引用的CustomType
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用FluentNHibernate引用的CustomType相关的知识,希望对你有一定的参考价值。
我正在使用一个名为LanguageExt的库。该库提供了一些处理C#代码中的函数编程的工具。我也使用FluentNHibernate将我的域类映射到我的数据库。
当属性可以为空时,我想使用LanguageExt中的Option<T>
。它是一个结构,可以保存一个值,也可以等于一个None。
我的一个类模型,比如Car
有一个可选属性,比如Sunroof
类型的Option<Window>
。像这样:
public class Car
{
Window _sunroof;
Option<Window> Sunroof
{
get => Optional(_sunroof);
set => _sunroof = value.IfNoneUnsafe(() => null);
}
}
我的映射是这样的:
References<Window>(x => x.Sunroof, "idSunroof")
.Not.Nullable();
我的问题是:如何使用其支持字段映射Sunroof属性,知道它们不共享相同的返回类型?
它是一个域模型,但也通过FluentNHibernate完成的映射配置映射到数据库中的某个表。
我不认为这是个好主意。你试图在这一个类中做三个(或者四个)的事情,我会分开。
我建议有一个用于NHibernate的DTO(可能叫做CarDto
)和一个商业模式(可能叫做Car
)。这样,CarDto
可以因与数据库相关的原因而改变(但不是出于建模原因),并且Car
可能因建模原因而改变(但不是出于数据库原因)。例如,函数式编程会使业务模型不可变,但NHibernate可能要求其DTO是可变的。如果出于两种目的使用相同的类型,则无法满足所有设计约束。
如何使用其支持字段映射Sunroof属性,知道它们不共享相同的返回类型?
我认为您不应该拥有不同类型的属性和支持字段。使用CarDto
,使用null
来表示没有Window
。然后当从CarDto
映射到Car
时,将null
映射到None
状态(通过您当前使用的Optional
函数)。然后当从Car
映射到CarDto
时,将None
映射回null
(通过您当前使用的IfNoneUnsafe
方法)。
你的Car
课程
- 是NHibernate的DTO,
- 是你的商业模式,
- 包含从DTO到业务模型的映射,以及
- 包含从业务模型到DTO的映射。
这是我上面提到的三到四件事(取决于你将映射计算为一两件事)。
增加2019-02-20
[你的答案是]不是我的问题的解决方案,而是建议更好的架构
这两者都是。
我完全同意你说的话,我很乐意这样做,但我不能。在我的代码库中,我有超过250个模型类,它们的设计非常糟糕,并且有很多错误的依赖项。我不能一次重构所有这些。
我不是建议你立刻改变一切。离得很远。在Martin Fowler的Refactoring风格中,我建议随着时间的推移做出许多小改动。
例如,将Car
更改为有多困难
public class Car
{
Option<Window> Sunroof
{
get => Optional(SunroofBacking);
set => SunroofBacking = value.IfNoneUnsafe((Window) null);
}
Window SunroofBacking { get; set; }
}
并出于业务逻辑原因使用(“更好”命名)属性Sunroof
并使用SunroofBacking
来解决NHibernate
的原因?
我终于找到了解决方案:
References(x => x.Sunroof, "idSunroof")
.Access.CamelCaseField(Prefix.Underscore)
.Class<Window>();
以上是关于使用FluentNHibernate引用的CustomType的主要内容,如果未能解决你的问题,请参考以下文章
1.使用FluentNHibemate 操作数据库,添加映射到数据库
使用 FluentNhibernate 和 Autofac 的映射接口
如何使用 FluentNHibernate 创建 ISessionFactory
使用NHibernate和FluentNHibernate创建数据库和表?