2009-09-13 92 views
0

我正在用ADO.NET實體框架實現存儲庫模式。我發現更新記錄比從數據庫中添加或刪除更復雜。請參閱下面的更新聲明並添加您的判斷聲明。使用Repository模式,更新記錄的最有效方法是什麼?

我想知道是否有任何方法可以更新記錄,而無需首先檢索原始記錄。

public void Update(User user) 
    { 
     var userToUpdate = (from u in db.UserSet 
          where u.UserID == user.UserID 
          select u).FirstOrDefault(); //original record 
     db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName, 
      user); 
     db.SaveChanges(); 
    } 

爲同一回購添加語句:

public void Add(User user) 
    { 
     user.MemberFrom = DateTime.Now; 
     _repository.AddToUserSet(user); 
     _repository.SaveChanges(); 
    } 

回答

1

不,你不能做到這一點與EF(除非你使用ADO.NET直接的課程)。也就是說,您可以通過向實體上下文的部分類添加一些方法來簡化檢索代碼。這就是我要做的事:

public partial class MyEntities 
{ 
    public T GetById<T>(object id) where T : class 
    { 
     EntityKey key = CreateKey<T>(id); 
     // see http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.getobjectbykey.aspx 
     return (T)GetObjectByKey(key); 
    } 

    public static EntityKey CreateKey<T>(object id) 
    { 
     var type = typeof(T); 
     return new EntityKey("MyEntities." + type.Name, "Id", id); 
    } 
} 

現在,你上面的代碼應該是

public void Update(User user) 
{ 
    var userToUpdate = db.GetById<UserSet>(user.UserID); 
    db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName, user); 
    db.SaveChanges(); 
} 
+0

你是對的,我不知道我在想什麼。我應該使用getObject方法而不是重新輸入相同的查詢,謝謝。我沒有實現泛型get,但是我會盡快完成一些其他功能。再次感謝。 – Geo 2009-09-14 11:52:33

相關問題