(流畅的)nhibernate条件表映射策略

时间:2010-03-08 13:21:31

标签: c# nhibernate fluent-nhibernate nhibernate-mapping

我无法控制数据库架构并具有以下(简化)表结构:

  • CityProfile
    • 编号
    • 名称
  • CountryProfile
    • 编号
    • 名称
  • RegionProfile
    • 编号
    • 名称

我有一个.Net枚举和类封装了这个地段:

public enum Scope { Region, Country, City }

public class Profile {
    public Scope Scope { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
}

我正在寻找一种机制,允许我映射到正确的表,如:

public class ProfileMap : ClassMap<Profile> {
    public ProfileMap() {
        switch (x => x.Scope) { // <--Invalid code here!
            case Scope.City: Table("CityProfile"); break;
            case Scope.Country: Table("CountryProfile"); break;
            case Scope.Region: Table("RegionProfile"); break;
        }
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

或者我接近了这个错误?

1 个答案:

答案 0 :(得分:2)

鉴于数据库架构已修复,我将这些作为3个单独的类映射,并作为any引用映射到公共接口。

class Foo
{
    public virtual IProfile Profile { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        ReferencesAny(m => m.Profile)
            .EntityTypeColumn("ProfileType")
            .EntityIdentifierColumn("ProfileId")
            .AddMetaValue<CityProfile>("CityProfile")
            .AddMetaValue<CountryProfile>("CountryProfile")
            .AddMetaValue<RegionProfile>("RegionProfile")
            .IdentityType<int>();
    }
}