2016-02-24 5 views
0

В нашем проекте MVC 5 наш контекст базы данных экземпляра в AccountController как этотEntity Framework 6 DbContext не сохраняя изменения

private CustomersContext _customersContext; 

    public CustomersContext CustContext 
    { 
     get 
     { 
      return _customersContext ?? new CustomersContext(); 
     } 
     private set 
     { 
      _customersContext = value; 
     } 
    } 

Каждый клиент упоминается в ряде источников. Нижеприведенная процедура изменяет UserId источника реферала на нового пользователя.

 var referralList = CustContext.Referrals.Where(d => d.UserId == membershipUser.Id); 
     foreach (Referral referral in referralList) 
     { 
      referral.UserId = newUser.Id; 
     } 

Stepping корыта код можно увидеть referral.UserId обновляется. Однако

var result = await CustContext.SaveChangesAsync(); 

возвращает 0. База данных не обновляется.

CustomersContext выглядит следующим образом

{ 
public partial class CustomersContext : IdentityDbContext<ApplicationUser>//, ICustomersContext 
{ 

    public CustomersContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static CustomersContext Create() 
    { 
     return new CustomersContext(); 
    } 

    public virtual DbSet<ReferralSource> ReferralSources { get; set; } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Referrals) 
      .WithRequired(e => e.User) 
      .HasForeignKey(e => e.UserId) 
      .WillCascadeOnDelete(false); 

Я не вижу каких-либо SQL, излучаемого в SQL Profiler. Почему изменения в базе данных не изменяются?

+1

Попробуйте окружив его попробовать/уловом http://stackoverflow.com/questions/ 28427473/how-can-i-confirm-if-an-async-ef6-wait-db-savechangesasync -работал-как-ожидалось –

+1

Попробуйте использовать только SaveChanges(), без async – syned

+0

Я попробовал обернуть его в try/catch блок. Никакое исключение не выбрасывается. Я попробовал SaveChanges (без async). Никакие записи не обновляются. – Vague

ответ

0

Ответ предоставляется @Issac не решить мою проблему, но он поставил меня на пути к решению. Ошибка

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. 

Предполагалось, что существует несколько экземпляров dbContext. Я удалил контекст из CTOR и инстанцирован контекст внутри с помощью заявления

using (CustomersContext customersContext = new CustomersContext()) 
{ 
    var referralList = customersContext.Referrals.Where(d => d.UserId == membershipUser.Id); 
    foreach (Referral referral in referralList) 
    { 
     referral.UserId = newUser.Id; 
    } 
    var result = await customersContext.SaveChangesAsync(); 
} 

и теперь все tickety-бух

1

Перед вызовом var result = await CustContext.SaveChangesAsync(); вам необходимо установить состояние объектов, которые вы хотите изменить. Somthing как:

var referralList = CustContext.Referrals.Where(d => d.UserId ==  membershipUser.Id); 
foreach (Referral referral in referralList) 
{ 
    referral.UserId = newUser.Id; 
    CustContext.Entry(referral).State = System.Data.Entity.EntityState.Modified; 
} 
var result = await CustContext.SaveChangesAsync(); 
+0

Спасибо @ Иссак. Когда я добавляю 'CustContext.Entry (referral) .State = System.Data.Entity.EntityState.Modified;' Я получаю 'Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker.' – Vague

+1

@Vague Пожалуйста, посмотрите [здесь] (http://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record) при обновлении записей. Кроме того, можете ли вы разместить больше своего контроллера или кода обслуживания? – Issac

Смежные вопросы