Fluent nhibernate NHibernate映射空对象/特殊情况模式

Fluent nhibernate NHibernate映射空对象/特殊情况模式,fluent-nhibernate,nhibernate-mapping,Fluent Nhibernate,Nhibernate Mapping,我希望有一个“UnassignedDepartment”对象,而不是让员工有一个空部门: public class UnassignedDepartment : Department { public UnassignedDepartment() : base("not yet assigned") { Id = -99; <-- just some Id that can be held constant, not be generated.. } }

我希望有一个“UnassignedDepartment”对象,而不是让员工有一个空部门:

public class UnassignedDepartment : Department
{
    public UnassignedDepartment() : base("not yet assigned") {
        Id = -99; <-- just some Id that can be held constant, not be generated..
    }
}
我使用S#rpArch的框架作为基本实体,混合了FNH自动映射、覆盖和约定。从持久性的角度来看,用“特殊”Id与其他部门保持这种关系似乎是合乎逻辑的,但我不知道如何正确地做到这一点。请开导我


Thx,Berryl

我不明白你想实现什么,但也许这会有所帮助。在Employee中将Department映射为私有字段,如果为空,则返回UnassignedDepartment

private Department _department; // map this in FNH

public Department Department
{
    get { return _department ?? _department.UNASSIGNED; }
}

对不起,我没说清楚。对象模型具有我需要的所有逻辑,并且工作正常。这是我试图解决的持久性(NHibernate/FNH)映射,这让我思考了一下。我不认为这是一个继承问题,我认为我只需要扩展适当的存储库来扁平化对象继承&将其视为另一个部门;有特殊情况的人(duh)。我明天会试试,然后发布结果或问另一个问题:-)。套用Fowler重构,电力公司处理未知居民客户(可能他们放弃了房子,不管什么)的一个选择是让客户财产实际上为空。但是,当您调用Customer.CalculateBill时,您必须检查空引用,因此您需要创建一个作为Customer子类的对象来使用多态性并避免所有空检查(空对象)。更好的是,创建一个Occuprate子类,它知道正确的地址,并且可以在有人获得止赎房屋并成为普通客户时累积成本。我的问题是如何使用NHibernate在db中映射这一点。一个概念(我认为这就是Jamie要做的)可以是使用NHib访问pvt字段并在db中实际存储null,而对象模型将null视为占用者,或者在我的情况下,将UnassignedDepartment。但这是否意味着您失去了引用完整性?另外,它会将你限制在一个特殊情况下。我看到的唯一的另一个选择是让db也处理这个特殊的问题,使用一些常量Id(即,-1),但是您会遇到阻止对它进行编辑的问题。这就是我想要解决的动机和问题。实际上,我处理的是公用设施数据,它主要与前提和仪表有关。因此,使用情况数据只能间接链接到当前客户。你的一些想法使用了“幻数”,即-99,-1,这是绝对应该避免的。除非我有强烈的动机去做,否则我会让部门无效。要让我实现像您的UnassignedDepartment这样的东西需要一个令人信服的理由。如果您有多个特例,您可以扩展Department并使用带有鉴别器的每个类的表来映射它。您需要一个业务规则(可能是一个触发器)来确保数据库对于每个特殊情况只包含一个部门记录。
private Department _department; // map this in FNH

public Department Department
{
    get { return _department ?? _department.UNASSIGNED; }
}