2012-09-02 68 views
0

我得到了用於用戶創建的代碼。如何使用Linq,Lambda和EF進行更新

public static void CreateUser(User user) 
    { 

      Save<User>(u => u.AddObject(user)); 

    } 

    Save<T>(Action<ObjectSet<T>> func) 
     where T : class 
    { 

     ... 

     func(entitySet); 

     entitiesContext.SaveChanges(); 
    } 

現在我想寫一個更新的方法,但它並沒有在u = user

public static void UpdateUser(User user) 
{ 
     Save<User>(u => u = user); 
}  

編譯如何更新對象?

+0

這是不明智的(有時是一個普通的錯誤)命名變量和類型相同。 – Lucero

+0

@Lucero當我在SO上發帖的時候,它就變得混亂起來。現在修復 – user1615362

回答

1

如果實體從上下文中分離出來,您可以按如下方式進行更新。

public static void UpdateUser(User user) 
{ 
     Save<User>(u => { 
     u.Attach(user); 
     u.Context.ObjectStateManager 
       .ChangeObjectState(user, System.Data.EntityState.Modified); 
     }); 
} 
0

如果你想用linq來做,那麼你可以實現應該有ref params的自定義泛型委託。例如。

public delegate void MyDelegate<T>(ref T x); 

public static void CreateUser(User user) 
{ 
     Save<User>((ref User u) => u = user)); 
} 

Save<T>(MyDelegate<ObjectSet<T>> func) 
    where T : class 
{ 

    ... 

    func(entitySet); 

    entitiesContext.SaveChanges(); 
} 
+0

不編譯 – user1615362

+0

無法將lambda表達式轉換爲委託類型'MyDelegate >',因爲參數類型與委託參數類型不匹配 – user1615362