2010-08-12 56 views
1

我使用Nhibernate和Fluent,並遇到繼承問題。Fluent NHibernate繼承問題

這裏我DB模式

桌腳

  • IDBASE(PK)
  • 字段1
  • TYPE

表T1

  • IDBASE(PK和FK)
  • 字段2
  • 字段3 ...

我的映射文件是:

public class BaseMap: ClassMap<BASE> 
{ 
    public BaseMap() 
    { 
     Id(x => x.Id, "IDBASE").GeneratedBy.Identity(); 

     Map(x => x.Field1); 
     DiscriminateSubClassesOnColumn("TYPE"); 
    } 
} 

    public class T1Map: SubclassMap<T1> 
    { 

     public T1Map() 
     { 
      Table("T1"); 
      KeyColumn("IDBASE"); 
      DiscriminatorValue("T1"); 

      Map(x => x.Field2).Not.Nullable(); 
      Map(x => x.Field3).Not.Nullable(); 
     } 
    } 

我用FluentMappings,而不是自動映射。

這裏我實體:

public abstract class BASE 
{ 
    public virtual long IdBase{ get; set; } 
    public virtual string Field1 { get; set; } 
} 

public class T1: BASE 
{ 
    public virtual string Field2 { get; set; } 
    public virtual string Field3 { get; set; } 
} 

T1實體從基實體繼承,問題是,當我試圖讓一個排的NHibernate儘量選擇在基表字段2和字段3,而他們應該T1選擇表。

我已經嘗試了幾十個黑客,但它仍然無法正常工作,如果有人認爲它會非常有幫助。

非常感謝。

回答

2

您正在指定一個鑑別符,這意味着繼承結構應該是每個類的層次結構;你將不會有這個設置的兩個表,你將有一個表中包含所有內容的表(因此爲什麼select對所有列都有相同的表)。

如果您刪除DiscriminateSubclassesOnColumn調用,它會將您的映射放入每個班級的表中,以便您擁有所需的結構。

0

其實我真的需要DiscriminateSubclassesOnColumn所以我找到了其他的解決辦法,我繼承了實體我做的參加這樣的映射:

public class T1Map: SubclassMap<T1> 
{ 

    public T1Map() 
    { 
     Join("T1", y => 
     { 
      y.KeyColumn("IDBASE"); 
      y.Map(x => x.Field2).Not.Nullable(); 
      y.Map(x => x.Field3).Not.Nullable(); 
     }); 
    } 
} 

,它工作正常,我可以保持鑑別列上我的基礎班。

謝謝