2010-06-22 50 views
3

我想在實體框架中執行通用插入。這是我寫的 -如何在實體框架中執行通用插入?

static public void Insert<T>(MyEntities DataContext, T obj) where T : class 
     { 
      try 
      { 
       DataContext.AddObject(DataContext,obj); 
       DataContext.SaveChanges(); 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Problems adding object" + e); 
      } 
     } 

但你可以看到AddObject方法是不是我想要的......它給它期待一個enitysetname我想在對象傳遞,然後將該對象添加到例外我的數據庫。但我不能做AddtoObjectName(),因爲我不知道對象。任何人都可以點我在這裏向正確的方向..

回答

6

在EF 4,你可以這樣做:

var os = DataContext.CreateObjectSet<T>(); 
os.AddObject(obj); 
DataContext.SaveChanges(); 

並請移除堆疊吃try/catch

+0

謝謝......它的工作......只是一個問題,你建議我應該刪除try/catch,但然後它將沒有錯誤處理?...我很抱歉,但我總是使用它...有沒有更好的方式來有錯誤處理? – Vishal 2010-06-23 14:27:46

+1

您的現有代碼沒有錯誤處理。你有錯誤混淆。 – 2010-06-23 14:36:00

+0

感謝您提供來源。這將是最有用的。 – StriplingWarrior 2010-06-24 16:39:32

2

的問題是,實體框架允許對使用相同類型的多個集合的可能性,所以它必須爲了工作有一個類型名稱。如果知道您不會使用多個具有相同類型的集合,則可以遵循一個命名約定,該約定可以從該類型構造名稱。

我們有同樣的問題,我們最初決定命名每個實體集[Type]Set(例如FormSet,ActivitySet)。

隨着.NET 4.0的出現,Microsoft公開了他們用於在Visual Studio中的EF工具中複用實體集的API,所以我們正在研究可能會使用默認複數形式,並使用該工具來計算取出默認名稱(例如Forms,Activities)。

using System.Data.Entity.Design.PluralizationServices; 
... 
internal static readonly PluralizationService PluralizationService = 
     PluralizationService.CreateService(CultureInfo.CurrentCulture); 
... 
static public void Insert<T>(MyEntities DataContext, T obj) where T : class 
{ 
    try 
    { 
     string setName = PluralizationService.Pluralize(typeof(T).Name); 
     DataContext.AddObject(setName,obj); 
     DataContext.SaveChanges(); 
    } 
    catch (Exception e) 
    { 
     throw new Exception("Problems adding object" + e); 
    } 
} 
+0

EntityCommon.PluralizationService.Pluralize在哪裏可以找到這個庫?我正在使用.net 4.0 – Vishal 2010-06-22 21:48:37

+0

EF 4有一個更好的解決方案:ObjectSet。 – 2010-06-23 13:19:32

+0

@VJ:我的錯誤。 EntityCommon是我們的課程。看到我更新的答案。 @Craig Stuntz:如果我理解正確,這個方法的目的是通用的,你永遠不必指定你試圖插入對象的ObjectSet。 ObjectSet對於一次性方法更好,因爲它提供了類型安全性,但是我不知道在這種情況下如何使它工作。 – StriplingWarrior 2010-06-23 16:34:42