c# - пример - entity framework подключение к существующей базе
Исключить свойство для обновления в инфраструктуре Entity (3)
Я искал подходящий способ отметить свойство, которое НЕ будет изменено при обновлении модели в MVC.
Например, возьмем эту маленькую модель:
class Model
{
[Key]
public Guid Id {get; set;}
public Guid Token {get; set;}
//... lots of properties here ...
}
то способ редактирования MVC выглядит так:
[HttpPost]
public ActionResult Edit(Model model)
{
if (ModelState.IsValid)
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
теперь, если мой вид не содержит токена, он будет аннулирован через это редактирование.
Я ищу что-то вроде этого:
db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).State = PropertyState.Unmodified;
db.SaveChanges();
Лучший способ, который я нашел, - быть включенным и задавать все свойства, которые я хочу включить вручную, но я действительно хочу только сказать, какие из них следует исключить.
Создайте новую модель, которая будет иметь ограниченный набор свойств, которые вы хотите обновить.
Т.е. если ваша модель объекта:
public class User
{
public int Id {get;set;}
public string Name {get;set;}
public bool Enabled {get;set;}
}
Вы можете создать собственную модель просмотра, которая позволит пользователю изменять имя, но не флаг Enabled:
public class UserProfileModel
{
public int Id {get;set;}
public string Name {get;set;}
}
Когда вы хотите выполнить обновление базы данных, выполните следующие действия:
YourUpdateMethod(UserProfileModel model)
{
using(YourContext ctx = new YourContext())
{
User user = new User { Id = model.Id } ; /// stub model, only has Id
ctx.Users.Attach(user); /// track your stub model
ctx.Entry(user).CurrentValues.SetValues(model); /// reflection
ctx.SaveChanges();
}
}
Когда вы вызываете этот метод, вы обновите имя, но свойство Enabled останется без изменений. Я использовал простые модели, но я думаю, вы получите изображение, как использовать его.
Я думаю, вы не хотите, чтобы свойство было изменено только в некоторых случаях, потому что, если вы не собираетесь использовать его никогда в своем приложении, просто удалите его из своей модели.
Если вы хотите использовать его только в некоторых сценариях и избегать его «аннулирования» в приведенном выше случае, вы можете попробовать:
Скрыть параметр в представлении с помощью HiddenFor:
@Html.HiddenFor(m => m.Token)
Это приведет к тому, что ваше первоначальное значение будет сохранено без изменений и передано обратно контроллеру.
- Использовать
TryUpdateModel
: http://msdn.microsoft.com/en-us/library/dd460189(v=vs.108).aspx
Загрузите снова свой объект в контроллере из своего DBSet
и запустите этот метод. Вы можете указать как белый список, так и черный список параметров, которые должны или не должны обновляться.
мы можем так использовать
db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).IsModified = false;
db.SaveChanges();
он будет обновляться, но без свойства Token