使用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课程

  1. 是NHibernate的DTO,
  2. 是你的商业模式,
  3. 包含从DTO到业务模型的映射,以及
  4. 包含从业务模型到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创建数据库和表?

FluentNHibernate - 如何在没有任何身份字段的情况下进行映射

具有自然键的流畅 NHibernate 引用实体