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)

Это приведет к тому, что ваше первоначальное значение будет сохранено без изменений и передано обратно контроллеру.

Загрузите снова свой объект в контроллере из своего DBSet и запустите этот метод. Вы можете указать как белый список, так и черный список параметров, которые должны или не должны обновляться.


мы можем так использовать

 db.Entry(model).State = EntityState.Modified;
 db.Entry(model).Property(x => x.Token).IsModified = false;
 db.SaveChanges();

он будет обновляться, но без свойства Token





entity-framework