2010-03-08 50 views
1

我没有对数据库架构无法控制,并具有以下(简化)表结构:(流利)NHibernate的条件表映射策略

  • CityProfile
    • 编号
    • 名称
  • 国家简介
    • 编号
    • 名称
  • 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); 
    } 
} 

还是我走近这个错了吗?

回答

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>(); 
    } 
} 
+0

谢谢,看起来比我已经着手的继承战略更好... – grenade 2010-03-09 10:11:13