2012-10-12 58 views
0

我有一個數據庫,其中包含各種對象的映射值表。使用實體框架插入時C#動態轉換

例如,Colour表包含BLK > Black, BLU > BLUE, ORA > ORANGE等和CarType表包含4DH > Four-door hatchback, 4WD > Four wheel drive等等

我使用實體框架代碼優先,所以我有一個背景下建立這樣的事情。

public class MappingContext : DbContext 
{ 
    public MappingContext() 
     : base("Mappings") 
    { 
    } 

    public DbSet<Colour> ColourMappings { get; set; } 
    public DbSet<CarType> CarTypeMappings { get; set; } 
} 

,涉及到每個表在我Mapping數據庫中的每個對象從基類繼承,像這樣:

public class Mapping 
{ 
    public int Id { get; set; } 

    public string OrignalValue { get; set; } 

    public string MappedValue { get; set; } 
} 

public class CarType : Mapping{} 
public class Colour : Mapping{} 

現在我想做的是從充滿XML文件中讀取這些映射包含映射並將它們插入到數據庫中的「模板」。

我有以下的方法來做到這一點:

public void InsertMappings(XDocument xml, string templateName, Type typeToInsert) 
{ 
    // Here I find the relevent mappings 

    using (var repo = new Repository()) 
    { 
     var mapppings = mappings.Select(mapping => new Mapping 
     { 
      MappedValue = mapping.Value, 
      OrignalValue = GetCode(mapping) 
     }); 

     foreach (var mapping in mapppings.ToList()) 
     { 
      var map = (typeToInsert)mapping // << This line will not compile 

      repo.Insert(map); 
     } 

    repo.Save(); 
    } 
} 

這不會complie因爲它不承認試圖投「(typeToInsert)映射」。

因此,基本上我需要知道的是,如何將此映射對象轉換爲特定的映射對象,並將其插入到數據庫中?或者有更好的方法提供任何建議!

+0

看看這個問題:http://stackoverflow.com/questions/4925718/c-dynamic-runtime-cast – SWeko

+0

我假設你動態解析'typeToInsert'在一些點,並將類型標識符傳遞給'InsertMappings' - 即不能只使用通用的'InsertMappings '方法? (愚蠢的問題真的...只是檢查) – Charleh

回答

1

從它的外觀你想投的Mapping實例作爲CarTypeColour這將無法工作,因爲Mapping不知道這些類型的事情,因爲它是基地類。

您的代碼需要創建一個具體類型的實例,即typeToInsert並將其轉換爲Mapping。你可以這樣做:

public void InsertMappings(XDocument xml, string templateName, Type typeToInsert) 
{ 
    // Here I find the relevent mappings 

    using (var repo = new Repository()) 
    { 
     foreach (var m in mappings) 
     { 
      // XML -> Entity 
      var mapping = (typeToInsert)Activator.CreateInstance(typeToInsert); 
      (mapping as Mapping).MappedValue = m.Value; 
      (mapping as Mapping).OriginalValue = GetCode(m); 
      // Update database 
      repo.Insert(mapping); 
     } 
     repo.Save(); 
    } 
} 

或許你也應該利用泛型這裏好,你可以重構你的方法是這樣的:

public void InsertMappings<T>(XDocument xml, string templateName) 
{ 
    // Here I find the relevent mappings 

    using (var repo = new Repository()) 
    { 
     foreach (var m in mappings) 
     { 
      // XML -> Entity 
      var mapping = (T)Activator.CreateInstance(typeof(T)); 
      (mapping as Mapping).MappedValue = m.Value; 
      (mapping as Mapping).OriginalValue = GetCode(m); 
      // Update database 
      repo.Insert(mapping); 
     } 
     repo.Save(); 
    } 
} 

使用

InsertMappings<CarType>(xmlDoc, "CarTemplate"); 
InsertMappings<Colour>(xmlDoc, "ColourTemplate"); 
+0

謝謝,我試過,但行「repo.Insert((T)映射);」仍然給我一個編譯錯誤 - 無法將類型'映射'的表達式轉換爲鍵入'T'? – Boob

+0

查看我更新的答案。 – James

+0

作品一種享受,非常感謝:) – Boob