Как обновить только одно поле с помощью Entity Framework? - PullRequest
168 голосов
/ 04 сентября 2010

Вот таблица

Пользователи

UserId
UserName
Password
EmailAddress

и код ..

public void ChangePassword(int userId, string password){
//code to update the password..
}

Ответы [ 15 ]

1 голос
/ 05 ноября 2018

Я искал то же самое, и, наконец, я нашел решение

using (CString conn = new CString())
{
    USER user = conn.USERs.Find(CMN.CurrentUser.ID);
    user.PASSWORD = txtPass.Text;
    conn.SaveChanges();
}

Поверьте мне, это работает для меня как шарм.

1 голос
/ 04 мая 2016

Я использую ValueInjecter nuget для внедрения Binding Model в объект базы данных, используя следующее:

public async Task<IHttpActionResult> Add(CustomBindingModel model)
{
   var entity= await db.MyEntities.FindAsync(model.Id);
   if (entity== null) return NotFound();

   entity.InjectFrom<NoNullsInjection>(model);

   await db.SaveChangesAsync();
   return Ok();
}

Обратите внимание на использование пользовательского соглашения, которое не обновляет Свойства, если они являются нулевыми с сервера.

ValueInjecter v3 +

public class NoNullsInjection : LoopInjection
{
    protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
    {
        if (sp.GetValue(source) == null) return;
        base.SetValue(source, target, sp, tp);
    }
}

Использование:

target.InjectFrom<NoNullsInjection>(source);

Значение Injecter V2

Поиск этот ответ

Протест

Вы не будете знать, было ли свойство намеренно очищено до нуля, ИЛИ оно просто не имело никакого значения. Другими словами, значение свойства может быть заменено только другим значением, но не очищено.

0 голосов
/ 01 ноября 2017
public async Task<bool> UpdateDbEntryAsync(TEntity entity, params Expression<Func<TEntity, object>>[] properties)
{
    try
    {
        this.Context.Set<TEntity>().Attach(entity);
        EntityEntry<TEntity> entry = this.Context.Entry(entity);
        entry.State = EntityState.Modified;
        foreach (var property in properties)
            entry.Property(property).IsModified = true;
        await this.Context.SaveChangesAsync();
        return true;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
0 голосов
/ 10 апреля 2015

Объединяя несколько предложений, я предлагаю следующее:

    async Task<bool> UpdateDbEntryAsync<T>(T entity, params Expression<Func<T, object>>[] properties) where T : class
    {
        try
        {
            var entry = db.Entry(entity);
            db.Set<T>().Attach(entity);
            foreach (var property in properties)
                entry.Property(property).IsModified = true;
            await db.SaveChangesAsync();
            return true;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("UpdateDbEntryAsync exception: " + ex.Message);
            return false;
        } 
    }

вызывается

UpdateDbEntryAsync(dbc, d => d.Property1);//, d => d.Property2, d => d.Property3, etc. etc.);

Или

await UpdateDbEntryAsync(dbc, d => d.Property1);

или

bool b = UpdateDbEntryAsync(dbc, d => d.Property1).Result;
0 голосов
/ 09 января 2014
public void ChangePassword(int userId, string password)
{
  var user = new User{ Id = userId, Password = password };
  using (var db = new DbContextName())
  {
    db.Entry(user).State = EntityState.Added;
    db.SaveChanges();
  }
}
...