2010-06-22 48 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