2009-09-13 43 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

相关问题