1

私はdiscriminators、usetypeとformattypeとして2つのデータベース列を使用するクラスごとの階層継承戦略を使用するレガシーデータベースを持っています。 UseTypeは最上位レベルを、formattypeは第2レベルを提供します。以下のようなデータから流暢なNHibernate - 多レベルのクラス階層のマッピング

public abstract class Unknown {} 

public abstract class Animal : Unknown { } 
public class Lion : Animal {} 
public class Lamb : Animal {} 

public class Mineral : Unknown { } 

public abstract class Vegetable : Unknown {} 

public class Rose : Vegetable { } 
public class Cabbage : Vegetable {} 

は基本的に私のようなクラス階層を移入できるようにしたいと思い

public sealed class UnknownMap : ClassMap<Unknown> 
{ 
    public UnknownMap() 
    { 
     DiscriminateSubClassesOnColumn("UseType"); 
    } 
} 

public sealed class AnimalMap : SubclassMap<Animal> 
{ 
    public AnimalMap() 
    { 
     DiscriminatorValue("Animal"); 
     DiscriminateSubClassesOnColumn("FormatType"); 
    } 
} 

public sealed class LionMap : SubclassMap<Lion> 
{ 
    public LionMap() 
    { 
     DiscriminatorValue("Lion"); 
    } 
} 

public sealed class LambMap : SubclassMap<Lamb> 
{ 
    public LambMap() 
    { 
     DiscriminatorValue("Lamb"); 
    } 
} 

public sealed class MineralMap : SubclassMap<Mineral> 
{ 
    public MineralMap() 
    { 
     DiscriminatorValue("Mineral"); 
    } 
} 

public sealed class VegetableMap : SubclassMap<Vegetable> 
{ 
    public VegetableMap() 
    { 
     DiscriminatorValue("Vegetable"); 
     DiscriminateSubClassesOnColumn("FormatType"); 
    } 
} 


public sealed class RoseMap : SubclassMap<Rose> 
{ 
    public RoseMap() 
    { 
     DiscriminatorValue("Rose"); 
    } 
} 

public sealed class CabbageMap : SubclassMap<Cabbage> 
{ 
    public CabbageMap() 
    { 
     DiscriminatorValue("Cabbage"); 
    } 
} 
:私は私が考えていた

 
| UseType | FormatType | 
-------------------------- 
| Animal | Lion  | 
| Animal | Lamb  | 
| Mineral | null  | 
| Vegetable | Rose  | 
| Vegetable | Cabbage | 

のようなユーザ流暢マッピング

残念ながら、DiscriminateSubClassesOnColumnはSubclassMapではサポートされていません。

Fluent NHibernate Wikiによれば、カスタムSQL文を使用することで複数の列識別子がサポートされます。

残念ながら、かなり多くのサブクラスをサポートする必要があります。コードでコンパイルされたものを使用することをお勧めします。結局のところ、私はFluent NHibernateを最初に使用しています。私の心に来て、文字列の連結を使用するための

+0

I'v (たとえば、 "Animal | Lion")の集約文字列を使用しようとしましたが、残念ながら文字列の連結はSQLではベンダーに依存しません(http://stackoverflow.com/questions/3939809/vendor-agnostic-sql-to-レコード間のフィールド値の連結 ")。 – aboy021

答えて

1

2オプション:

  • 各DB-システムで再実装することができstringconcatenationためにStoredProcedureを生成し、

  • が作る、それを呼び出すための式を使用クラスマップUnknownMapデータベース意識

    public UnknownMap() 
    { 
        string formula; 
        switch (Configuration.GetDbType()) 
        { 
         case DBType.SQLServer: 
          formula = "GROUP_CONCAT(UseType, FormatType´)"; 
          break; 
         ... 
        } 
    
        DiscriminateSubClassesOnColumn("") 
         .Formula(formula); 
    } 
    
+0

あなたが正しいかもしれないようです。大文字のステートメントを使って調べましたが、ちょうど醜いことになります。ビットシフトされ追加された整数識別器は別のオプションです((usetype * 10000)+ formattype)。 – aboy021

+0

@ aboy021素敵なアイデア、データベースで読みにくいが実装が簡単 – Firo

関連する問題