Entity Framework 6 dbContext 未保存更改

Entity Framework 6 dbContext not saving changes

在我们的 MVC 5 项目中,我们的数据库上下文在 AccountController 中像这样实例化

    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;
        }

单步执行代码,我可以看到 referral.UserId 正在更新。不过

var result = await CustContext.SaveChangesAsync();

returns0.数据库未更新

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 Profiler 中没有看到任何 sql 发出。为什么数据库上下文不保存更改?

在调用 var result = await CustContext.SaveChangesAsync(); 之前,您需要设置要修改的实体的状态。像这样的东西:

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();

@Issac 提供的答案并没有解决我的问题,但确实让我走上了解决问题的道路。错误

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

建议有多个 dbContext 实例。我从 CTOR 中删除了上下文并在 using 语句

中实例化了上下文
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();
}

现在一切都变得很糟糕