2012-10-17 52 views
2

我正在做一些項目,我遇到了一些問題,我不知道它是否可以解決。 所以我的問題是這樣的:映射父親時生成子對象枚舉(流利Nhibernate)

我有4個班在我的項目:

public abstract class ABaseDynamicLayer 
{ 
    public virtual int LayerID { get; set; } 
    public virtual string URIPath { get; set; } 
} 

public class RasterDynamicLayer : ABaseDynamicLayer 
{ 
} 

public class TerrainDynamicLayer : ABaseDynamicLayer 
{ 
} 

public class VectorDynamicLayer : ABaseDynamicLayer 
{ 
} 

現在我的數據庫看起來像這樣:

T_DYNAMIC_LAYERS

ID | URIPath | TYPE | 
--------------------------- 
1 | c:\map1.mp | 1 | 
2 | c:\map2.mp | 3 | 
3 | c:\map5.mp | 2 | 

T_TYPES

ID | DESCRIPTION | 
--------------------- 
1 | Raster  | 
2 | Terrain  | 
3 | Vector  | 

現在我的目標是將T_DYNAMIC_LAYERS映射到我的項目中,而我這樣做時,我不想保存圖層的類型,而是想從我的班級列表中創建適配對象,因爲它們的類型在T_DYNAMIC_LAYERS中提到。

例如:

比方說,我們是在映射T_DYNAMIC_LAYERS第一排的進步。 1)我們將ID列映射到ID屬性。 2)我們將URIPath列映射到URIPath到URIPath屬性。

這很簡單,但所需的結果是,我想從第一行開始獲取RasterDynamicLayer的對象,因爲行中的類型爲1(1等於RasterDynamicLayer)。

可以這樣做嗎? 如果可以做到,我該怎麼做?

謝謝你的幫助!

+1

這是什麼幫助? http://www.philliphaydon.com/2011/08/fluent-nhibernate-table-inheritance-discriminators/ –

回答

0

我想你需要factory pattern 使用的簡單的例子:

enum LayerType 
{ 
    Raster, 
    Terrain, 
    Vector 
} 

public static ABaseDynamicLayer CreateLayer(LayerType type, int id, string uri) 
{ 
    ABaseDynamicLayer layer; 
    switch (type) 
    { 
     case LayerType.Raster: 
      layer = new RasterDynamicLayer(); 
      break; 
     case LayerType.Terrain: 
      layer = new TerrainDynamicLayer(); 
      break; 
     case LayerType.Vector: 
      layer = new VectorDynamicLayer(); 
      break; 
     default: throw new ArgumentException("Type not supported:" + type.ToString()); 
    } 
    layer.LayerID = id; 
    layer.URIPath = uri; 
    return layer; 
} 
+0

我不能使用工廠,因爲我想構建一個引擎,它在映射發生時創建對象 – GilTvil