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();
}
现在一切都变得很糟糕
在我们的 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();
}
现在一切都变得很糟糕