Редактирование и обновление сущности Entity Framework в ASP .NET MVC - PullRequest
3 голосов
/ 24 января 2010

У меня есть сущность, которая называется «ABC» (атрибуты ID и Title).

В представлении обновления записи я добавил идентификатор в качестве скрытого поля, а заголовок - это текстовое поле.

Контроллер выглядит примерно так:

public ActionResult UpdateAction( ABC obj )

Я получаю все хорошо и честно в объектах, то есть в названии и удостоверении личности.

Теперь, чтобы обновить запись в базе данных, я прочитал исходную сущность:

var original = (from x in base.context.ABC where x.id == obj.id ).Single();

Теперь, чтобы отразить изменения в оригинале, думаю, стоит сделать обновление модели:

this.TryUpdateModel( original );

Я получаю ошибку: | ... указав, что идентификатор столбца не может быть изменен.

The property 'id' is part of the object's key information and cannot be modified. 

Я не хочу вручную присваивать свойства исходному объекту.

Другой альтернативой может быть:

TryUpdateModel(original, new string[] { "Title" }, form.ToValueProvider());

Но я ненавижу строки - у моего объекта 20 атрибутов: |

Может кто-нибудь предложить лучший способ сделать это?

1028 * Rgds *

1 Ответ

2 голосов
/ 24 января 2010
public class ControllerExt : Controller
{
    protected void UpdateModel<TModel>(TModel model, params Expression<Func<TModel, object>>[] property) where TModel : class
    {
        var props = new List<string>(property.Length);
        foreach (var p in property)
        {
            var memberExpression = RemoveUnary(p.Body) as MemberExpression;
            if (memberExpression == null)
            {
                throw new NullReferenceException("Can not retrieve info about member of {0}".FormatThis(typeof(TModel).Name));
            }
            props.Add(memberExpression.Member.Name);
        }
        this.UpdateModel(model, props.ToArray());
    }

    private static Expression RemoveUnary(Expression body)
    {
        var unary = body as UnaryExpression;
        if (unary != null)
        {
            return unary.Operand;
        }
        return body;
    }
}

Пример:

UpdateModel<MyModel>(model, x => x.PropertyFromMyModel_1, x => x.PropertyFromMyModel_2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...