C# 为什么每次我试图保存更改时,我的实体都会抛出异常?
我有一个web服务,它通过AJAX提供信息,然后我的服务根据当前用户的更改来更新他们的数据 我的问题是,当我根据下面的消息调用C# 为什么每次我试图保存更改时,我的实体都会抛出异常?,c#,entity-framework,wcf,C#,Entity Framework,Wcf,我有一个web服务,它通过AJAX提供信息,然后我的服务根据当前用户的更改来更新他们的数据 我的问题是,当我根据下面的消息调用SaveChanges时,我的实体不断抛出异常 EntityFramework.dll中发生“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常,但未在用户代码中处理 其他信息:Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改
SaveChanges
时,我的实体不断抛出异常
EntityFramework.dll中发生“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常,但未在用户代码中处理
其他信息:Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。有关了解和处理乐观并发异常的信息,请参阅
我启用了乐观并发,我最初还认为这是因为没有设置经销商ID,这是我数据库的主键,但是经销商ID很好,所以我看不出哪里出了问题
我能够在不首先显示信息的情况下更新用户信息,因此我认为这个问题与使用相同的实体来显示数据以及更新数据有关,但我不太确定
我的代码在下面
class Dashboards
{
//this is my EF Model
dealer DealerObj = new dealer();
public void UpdateDealerInfo(string UserName, DealerInfoViewModel model)
{
using (var context = new VatsWebDealerEntity())
{
var UserInfo = context.dealers.AsNoTracking().Where(m => m.Name == UserName).Select(m => m).ToArray();
var UserID = context.dealers.AsNoTracking().Where(m => m.Name == UserName).Select(m => m.DealerID).FirstOrDefault();
//DealerObj.DealerID = UserID;
foreach (var item in UserInfo)
{
if (item.Name != model.NewValue)
{
DealerObj.Name = model.NewValue;
}
else if (item.Address1 != model.NewValue)
{
DealerObj.Address1 = model.NewValue;
}
else if (item.Address2 != model.NewValue)
{
DealerObj.Address2 = model.NewValue;
}
else if (item.Address3 != model.NewValue)
{
DealerObj.Address3 = model.NewValue;
}
else if (item.PostCode != model.NewValue)
{
DealerObj.PostCode = model.NewValue;
}
else if (item.Town != model.NewValue)
{
DealerObj.Town = model.NewValue;
}
//else if (item.CountryID != model.NewValue)
//{
// DealerObj.country = model.NewValue;
//}
else if (item.ContactName != model.NewValue)
{
DealerObj.ContactName = model.NewValue;
}
else if (item.ContactTelephone != model.NewValue)
{
DealerObj.ContactTelephone = model.NewValue;
}
else if (item.Phone != model.NewValue)
{
DealerObj.Phone = model.NewValue;
}
DealerObj.DealerID = UserID;
DealerObj.CountryID = 1;
var entry = context.Entry(DealerObj);
context.dealers.Attach(DealerObj);
//context.Entry(DealerObj).Property(e => e.DealerID).IsModified = false;
context.Entry(DealerObj).State = System.Data.Entity.EntityState.Modified;
//entry.State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
}
}
}
我还没有测试过它,但请尝试使用
context.SaveChanges()
在您的foreach
循环之外,您可以编写var UserID=context.derals.AsNoTracking().Where(m=>m.Name==UserName)。选择(m=>m.DealerID.FirstOrDefault()
asvar user=context.derals.AsNoTracking().FirstOrDefault(m=>m.Name==UserName);如果(user!=null){var userId=user.DealerId;}
为什么要使用AsNoTracking
?如何启用乐观并发?快照还是RCS?您确定另一个进程在加载后和保存前不能更改经销商记录吗?您是否尝试了此处所述的重新加载方法?