2015-11-02 48 views
0

我目前使用以下方法將數據保存在數據庫中的多個表中,我從Excel文件中提取數據。使用實體框架爲多個表保存數據的更好方法

public class Saver 
{ 

    public static int SaveCensusBatch(string key, ICollection<tbl_Life_Census> collection) 
    { 
     using (var db = new AuraEntities()) 
     { 
      var entry = new tbl_Life_Master() { UUID = key, tbl_Life_Census = collection }; 

      db.tbl_Life_Master.Add(entry); 
      db.SaveChanges(); 
      return 1; 
     } 
    } 

    public static int SaveLifeData(string key2, ICollection<tbl_Life_General_Info> collection) 
    { 
     using (var db = new AuraEntities()) 
     { 
      var entry = new tbl_Life_Master() { UUID = key2, tbl_Life_General_Info = collection }; 

      db.tbl_Life_Master.Add(entry); 

      db.SaveChanges(); 
      return 1; 
     } 
    } 

    public static T GetDBRecordByPK<T>(string key) where T : class 
    { 
     using (var db = new AuraEntities()) 
     { 
      var t = db.Set<T>().Find(key); 
      return t; 
     } 
    } 

} 

以下是對主調用此代碼:

foreach (var r in results) 
       { 
        r.UUID = key.ToString(); 
       } 


       Saver.SaveCensusBatch(key.ToString(), results); 
       Saver.SaveLifeData(key.ToString(), results3); 
       var master = Saver.GetDBRecordByPK<tbl_Life_Master>(key.ToString()); 

「使用塊」和一個功能而不是隻實現幾個功能請建議我怎麼可以在一個做的一切。這是因爲我必須同時向20-30個表中插入數據。

+0

非常不清楚。什麼是「結果」,它來自何處?你爲什麼設置'r.UUID'?什麼是'results3',它來自哪裏?你爲什麼首先要做這個'Saver'類?爲什麼不直接在最後的代碼片段中保存所有內容? –

+0

謝謝我也一樣 –

回答

0

你可以選擇你的結果到列表中,並將列表傳遞給函數。在該保存功能中,您可以爲每個UUID執行循環,併爲循環內的前三個函數提供代碼。然後在循環結尾調用db.SaveChanges()。 db.saveChanges()作爲事務工作,如果在保存過程中的任何時候出現錯誤,都會回滾。

+0

你能爲我做一個片段嗎?因爲我試圖這樣做,但是我在語法和所有方面都遇到了一些問題。我是新來的實體框架。請儘可能幫助 –

+0

你能告訴我如何將所有結果放入列表中,因爲它們已經在單獨的列表中 –

0

您可以通過使所有Saver類的方法都是非靜態的(它也阻止在不需要的時候將數據保存在內存中)並使其實現IDisposable接口。在此之後,你只需要按照微軟建議一次性模式(https://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx),例如:

public class Saver : IDisposable 
{ 
    private readonly AuraEntities db; 
    private bool disposed; 

    public Saver() 
    { 
     db = new AuraEntities(); 
     disposed = false; 
    } 

    public int SaveCensusBatch(string key, ICollection<tbl_Life_Census> collection) 
    { 
     var entry = new tbl_Life_Master() { UUID = key, tbl_Life_Census = collection }; 

     db.tbl_Life_Master.Add(entry); 
     return 1; 
    } 

    public int SaveLifeData(string key2, ICollection<tbl_Life_General_Info> collection) 
    { 
     var entry = new tbl_Life_Master() { UUID = key2, tbl_Life_General_Info = collection }; 

     db.tbl_Life_Master.Add(entry); 

     return 1; 
    } 

    public T GetDBRecordByPK<T>(string key) where T : class 
    { 
     var t = db.Set<T>().Find(key); 
     return t; 
    } 

    public void Save() 
    { 
     db.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed) 
     { 
      return; 
     } 

     if (disposing && db != null) 
     { 
      db.Dispose(); 
      disposed = true; 
     } 
    } 
} 

,然後調用這樣一個using語句中的方法:

using(var saver = new Saver()) 
{ 
    saver.SaveCensusBatch(key.ToString(), results); 
    saver.SaveLifeData(key.ToString(), results3); 
    saver.Save(); 
} 

更新:它如果您從保存者課程外部保存,效果會更好。因爲他的整個過程將表現爲單個事務,並且如果引發異常,它將不會被持續。