- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个名为 LanguageExt 的库.这个库提供了一些工具来处理 C# 代码中的函数式编程。我还使用 FluentNHibernate 将我的域类映射到我的数据库。
当属性可为空时,我想使用 Option<T>
来自 LanguageExt。它是一个包含值或等于 None 的结构。
我的类(class)模特之一,说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 属性,知道它们不共享相同的返回类型?
最佳答案
It's a domain model but also mapped to some table in the database via the mapping configuration done by FluentNHibernate.
我不认为这是个好主意。你正试图在这门课上做三件(或四件)我会分开的事情。
我建议为 NHibernate 使用一个 DTO(可能称为 CarDto
)和一个业务模型(可能称为 Car
)。这样,CarDto
可以因为与数据库相关的原因而改变(但不是因为建模原因),Car
可以因为建模原因而改变(但不是因为数据库原因)。例如,函数式编程的业务模型是不可变的,但 NHibernate 可能要求其 DTO 是可变的。如果您为这两个目的使用相同的类型,那么您将无法满足所有的设计约束。
how do I map the Sunroof property using its backing field knowing that they don't share the same return type?
我认为您不应该拥有不同类型的属性和支持字段。对于 CarDto
,使用 null
表示缺少 Window
。然后当从CarDto
映射到Car
时,将null
映射到None
状态(通过Optional
您当前正在使用的函数)。然后当从 Car
映射到 CarDto
时,将 None
映射回 null
(通过 IfNoneUnsafe
您当前正在使用的方法)。
你的汽车
类
这就是我上面提到的三四件事(取决于你把映射算作一件事还是两件事)。
添加于 2019-02-20
[your answer is] not a solution to my problem but a proposal for a better architecture
两者兼而有之。
I fully agree with what you said and I would be very happy to do that but I can't. In my code base I have more than 250 model classes which are quite badly designed and with a lot of wrongly made dependencies. I can't afford to refactor all of that at once.
我并不是建议您立即更改所有内容。离得很远。风格Refactoring作者 Martin Fowler,我建议随着时间的推移进行许多小的更改。
例如,将Car
改成
public class Car
{
Option<Window> Sunroof
{
get => Optional(SunroofBacking);
set => SunroofBacking = value.IfNoneUnsafe((Window) null);
}
Window SunroofBacking { get; set; }
}
并出于业务逻辑原因使用(“更好”命名的)属性 Sunroof
并出于 NHibernate
原因使用 SunroofBacking
?
关于c# - CustomType 对 FluentNHibernate 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747437/
我正在使用 Team City 进行持续集成,用于 .Net 4 ASP MVC 3 应用程序。 在我的开发机器上,我可以构建和运行我的应用程序,但在构建服务器上我收到以下错误: ASPNETCOM
我有以下实体 我试图在 FluentNHibernate 的帮助下映射它们。 关于实体的一些说明: 属性 CreatedBy和 AssignedTo在 Task实体是 Person 类型,在数据库端是
我有一个名为权限的枚举。可以为用户分配权限,也可以为角色分配权限,然后为用户分配角色。 User 和 Role 都有这样的属性: public virtual IList Permissions {
有没有一种简单的方法为所有生成的表名加上字符串前缀? 惯例 Table.Is(x => "Prefix" + x.EntityType.Name) 仅适用于实体表(不适用于联接表或子类表) 我似乎找不
给定一个 Vehicle 类和一个 VehicleProperty 类... public class Vehicle { public virtual int Id { get; prote
出于某种原因,我无法正确完成此查询,而且我不明白为什么... 我有一个名为“博客”的对象,它有一个 ID 和一个“标签”列表。 每个“标签”都有一个 ID 和一个“名称”属性。 由于这是多对多关系,我
我有一个简单的 Fluent-NHibernate 映射让我很头疼!我正在尝试为其中一个实体映射字典,但它的 FK 仍然为空。 这是实体代码: public class Person { pu
我对 FluentNhibernate 公式映射有疑问。我需要在公式中使用联接表中的一列。 问题在以下三个表中得到证明:City, Person, Address class Person {
我有一个非常简单的数据库表,它以多对多关系连接另外两个表。 (几乎是将用户加入到问题中——想想书签) 此表的 NHibernate 实体如下所示: public class UserToRequest
我尝试通过使用多个 .Mappings 扩展调用手动添加映射类,但它似乎只包括最后一个。那么如何添加几个选定的类映射或多个程序集呢? 我的流畅配置通常如下所示: Return Fluently.Co
好的,所以昨天我设法获得了 NHibernate 和 FluentNHibernate 的最新主干版本,以用于我最新的小项目。 (我正在开发一个错误跟踪应用程序。)我使用 Repository 模式创
我遇到了 FluentNHibernate 的问题,希望有人可以帮助我。 我在名为 CampaignAreas 和 CampaignProducts 的两个类之间存在多对多关系。遗憾的是,Fluent
在我的应用程序中,我经常使用 FluentNHibernate。不幸的是,a Visual Studio Bug has forced me to get a different FNH versio
使用 Fluent NHibernate 映射简单的 Dictionary 属性的最佳方法是什么? 最佳答案 public class PersistedData { public virtu
我正在尝试使用 FluentNHibernate 创建与同一实体的关系,但不知道如何操作。有人成功了吗?你能帮帮我吗? 这是我的实体类: public class Menu { public
我有一个基类,其中包含一个名为 IsDirty 的属性。这是用于域模型的,不是数据库表中的列。 使用自动映射时,Fluent nhibernate 会尝试将此列添加到表中。解决此问题的一种方法是输入
我定义了以下数据库表: 俱乐部:身份证、姓名 成员:身份证、姓名 ClubMember: ClubId, MemberId 我定义了以下实体类: public class Club() {
我正在为尝试使用遗留数据库模式创建映射的当前场景而苦苦挣扎: 我有一对由组合键链接的父/子类,我正在使用 FluentNHibernate 创建它们之间的映射和关联。以下是类(class): /*Pa
FluentNHibernate 的自动映射是否支持通过约定创建多列唯一约束? 我可以轻松地创建单列唯一约束: public void Apply(IPropertyInstance instance
我正在将我的应用程序切换到 Postgresql,我的架构中的所有表都是小写的,当我使用 NHibernate 进行查询时,它会向映射中的表名添加双引号是 PascalCase 并导致查询失败,告诉我
我是一名优秀的程序员,十分优秀!