Каков наиболее эффективный способ обновления записей с помощью шаблона репозитория?

Я реализую шаблон репозитория с помощью структуры сущностей 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();
    }

person Geo    schedule 13.09.2009    source источник


Ответы (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();
}
person Buu Nguyen    schedule 14.09.2009
comment
Вы правы, я не знаю, о чем я думал. Я должен использовать метод getObject вместо повторного ввода того же запроса, спасибо. Я не реализовал общий get, но я это сделаю, как только сделаю некоторые другие функции. Спасибо еще раз. - person Geo; 14.09.2009