首页 > 解决方案 > NHibernate:相同的类型,不同的 ClassMaps?

问题描述

我有一个用例,在不同的一对多关系中使用相同的类型,并且关系的多方面的数据必须根据使用情况存储到不同的表中。有没有办法告诉(流利的)NHibernate 使用哪个 ClassMap(例如UseClassMap下面我的假方法)?

粗略的示例代码:

public class Foo
{
  public long Id {get; set;}
  public IEnumerable<Bar> TheoreticalBar {get; set;}
  public IEnumerable<Bar> ActualBar {get; set; }
}

public class FooMap : ClassMap<Foo>
{
  Table("Foo");
  Id(x => x.Id);
  HasMany(x => x.TheoreticalBar).UseClassMap(TheoryBarMap);
  HasMany(x => x.ActualBar).UseClassMap(ActualBarMap); 
}

public class TheoreticalBarMap : ClassMap<Bar>
{
  TableNames("TheoreticalBar");
  ...
}

public class ActualBarMap : ClassMap<Bar>
{
  TableNames("ActualBar");
  ...
}

标签: c#nhibernatefluent-nhibernate

解决方案


为了获得更多任意和无法解释的反对票,我将回答这个问题:我无法找到明确声明要使用的 ClassMap 的特定方法,但我能够在不添加不必要的子类型或类似内容的情况下找到解决方案ClassMaps 通过向父类设置的子类添加一个鉴别器值,然后使用 .Where() 方法过滤鉴别器值......像这样:

class Bar
{
  public string BarType {get; protected set};

  public Bar(string barType)
  {
    BarType = barType;
  }
}

public class FooMap : ClassMap<Foo>
{
  Table("Foo");
  Id(x => x.Id);
  HasMany(x => x.TheoreticalBar).Where("BarType = theoretical");
  HasMany(x => x.ActualBar).Where("BarType = actual"); 
}

.Where() 方法允许使用字符串插值和替换,以防您想在我的简单示例中避免使用魔术字符串。


推荐阅读