2013-01-20 47 views
3

我升級了一個在ef4開始的舊項目,但現在我已將它遷移到ef5等效於DbContext上的ObjectContext.AddObject(entityName,entity)

這是舊代碼:

protected void SaveEntity<T>(T entity) 
{ 
     using (DocsManagerContainer context = new DocsManagerContainer()) 
       { 
        string entityType = typeof(T).ToString(); 
        GetLogger().LogMessage("Save " + entityType + " started", LogLevel.Info); 
        DbTransaction transaction = null; 
        try 
        { 
         context.Connection.Open(); 
         transaction = context.Connection.BeginTransaction(); 
         context.AddObject(typeof(T).Name + "s", entity); 
         transaction.Commit(); 
         context.SaveChanges(); 
        } 
        catch (Exception e) 
        { 
         GetLogger().LogMessage("Save " + entityType + " thrown error :", e, LogLevel.Error); 
         throw e; 
        } 
        finally 
        { 
         context.Connection.Close(); 
         transaction = null; 
        } 
        GetLogger().LogMessage("Save " + entityType + " ended", LogLevel.Info); 
       } 
    } 

我幾乎所有的代碼升級,除了:context.AddObject(typeof(T).Name + "s", entity);,但這不是支持了。
我該如何升級?

p.s.我確實想使用通用代碼,而不是使用開關來添加相應的對象來糾正ObjectSet p.s. 。錯誤,如果我使用.SET()添加(實體)是:

Error 2 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Entity.DbContext.Set<TEntity>()' D:\work\DocsManager\trunk\DocsManagerDataMapper\EF4Factory\BaseEF4Factory.cs 64 21 DocsManagerDataMapper 
+0

'DbContext'或'ObjectContext'?使用'DbContext',你可以使用'context.Set ().Add(entity);' –

+0

我想使用DBContext,而不是像我在問題中所述的對象上下文。 –

+0

我想能夠使用DbContext。[...]。AddObject(EntityName,entity);或者如果可能的話類似的東西。 –

回答

9

用的DbContext您可以使用context.Set<T>().Add(entity);

示例:context.Set<User>()相當於context.Users因此context.Set<User>().Add(myUser)相當於context.Users.Add(myUser)

你想要的東西更接近這個:

protected void SaveEntity<T>(T entity) 
    where T : class 
{ 
    using (DocsManagerContainer context = new DocsManagerContainer()) 
    { 
     DbTransaction transaction = null; 
     try 
     { 
      context.Connection.Open(); 
      transaction = context.Connection.BeginTransaction(); 
      context.Set<T>().Add(entity); 
      transaction.Commit(); 
      context.SaveChanges(); 
     } 
     finally 
     { 
      context.Connection.Close(); 
       transaction = null; 
     } 
    } 
} 
+0

讓我試試看。 –

+0

如果我使用這樣的內容:context.Set ().Add(entity);它會拋出一個編譯錯誤。請看我編輯的問題。 –

+0

您可能需要爲您的方法添加通用約束'where T:class'。什麼是編譯錯誤? –