具有相似属性但没有继承层次结构的Fluent NHibernate映射表

本文关键字:Fluent NHibernate 映射 层次结构 继承 相似 属性 | 更新日期: 2023-09-27 18:14:17

我在为以下模型结构开发一组相同的Fluent NHibernate映射时遇到了问题:

public class BaseLookup
{
    public virtual int Id {get; set;}
    public virtual string Code {get; set;}
    public virtual string Value {get; set;}
    public virtual bool Active {get; set;}
}
public class Subdivision : BaseLookup { }
public class AvisCode : BaseLookup { }
public class District : BaseLookup { }
/*etc.*/

这些查找都共享属性,但除此之外彼此之间没有关系。这些表对于报告具有特殊的语义含义,并且将在存储过程中被特别引用,因此我不希望将它们混在一个普通的"查找"表中,因为这需要使用鉴别符。这似乎在我的映射中消除了按层次表和按子类表的策略。我在使用每个具体类表时也遇到了困难,因为每个查找都有自己的标识列——我不想在应用程序中手动分配Id,也不要求Id在所有这些表中都是唯一的。

目前,我的映射看起来是这样的,并且对于basellookup的每个超类都是相同的:

public class AvisCodeMap : ClassMap<AvisCode>
{
    public AvisCodeMap()
    {
        Schema(Schemas.pva.ToString());
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Code).Not.Nullable();
        Map(x => x.Value).Not.Nullable();
    }
}

是否没有映射约定允许我将重复映射提取到可重用代码块?

具有相似属性但没有继承层次结构的Fluent NHibernate映射表

如果我对你的问题理解正确,你可能需要创建一个通用的基类映射,然后在派生映射中重用它。

示例如下:

public class BaseLookupMap<T> : ClassMap<T> where T : BaseLookup
{
     public BaseLookupMap()
     {
        // ... base mapping code goes here ...
     }
}

创建基类型:

public class BaseLookupMap : BaseLookupMap<BaseLookup>
{  
}

和派生类映射:

public class AvisCodeMap : BaseLookupMap<AvisCode>
{
    public AvisCodeMap()
    {
        Polymorphism.Explicit();
        // ... your other mappings here, if needed ...
    }
}

HTH .