Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用存储库模式,更新记录的最有效方法是什么?_Asp.net Mvc_Repository Pattern - Fatal编程技术网

Asp.net mvc 使用存储库模式,更新记录的最有效方法是什么?

Asp.net mvc 使用存储库模式,更新记录的最有效方法是什么?,asp.net-mvc,repository-pattern,Asp.net Mvc,Repository Pattern,我正在用ADO.NET实体框架实现存储库模式。我发现更新记录相对来说比从数据库中添加或删除记录要复杂得多。请参见下面的更新声明和添加声明以供判断 我想知道是否有任何方法可以更新记录而不必首先检索原始记录 public void Update(User user) { var userToUpdate = (from u in db.UserSet where u.UserID == user.UserID

我正在用ADO.NET实体框架实现存储库模式。我发现更新记录相对来说比从数据库中添加或删除记录要复杂得多。请参见下面的更新声明和添加声明以供判断

我想知道是否有任何方法可以更新记录而不必首先检索原始记录

 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();
    }

不,您不能使用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);
    }
}
公共部分类MyEntities
{
公共T GetById(对象id),其中T:class
{
EntityKey=CreateKey(id);
//看http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.getobjectbykey.aspx
return(T)GetObjectByKey(key);
}
公共静态EntityKey CreateKey(对象id)
{
var类型=类型(T);
返回新的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();
}
公共作废更新(用户)
{
var userToUpdate=db.GetById(user.UserID);
db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName,用户);
db.SaveChanges();
}

你说得对,我不知道我在想什么。我应该使用getObject方法,而不是重新键入相同的查询,谢谢。我还没有实现通用的get,但我会在完成一些其他功能后立即实现。再次感谢。