jav*_*ati 10 c# asp.net-mvc entity-framework
错误信息 :
附加"FaridCRMData.Models.Customer"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.
Attach()如果图中的任何实体具有冲突的>键值,则在使用该方法或将实体的状态设置为"未更改"或"已修改" 时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".
我的代码:
public class FactorController : Controller
{
public JsonResult SaveFactor(Factor factor,int id)
{
if (id > 0)
{
bool result = new FactorService.BaseService.Update(factor);
return new JsonResult() { Data = result };
}
}
}
Run Code Online (Sandbox Code Playgroud)
FactorService.BaseService.cs:
public bool Update(TEntity entity)
{
var entry = context.Entry(entity);
if (entry.State == EntityState.Detached || entry.State == EntityState.Modified)
{
context.Set<TEntity>().Attach(entity);// Error Is Here
entry.State = EntityState.Modified;
context.SaveChanges();
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
Nit*_*are 12
我相信您可能在更新之前调用了Select。默认情况下,DBContext将在记录被选中(选中)时缓存记录,在获取记录时在select调用中使用“ AsNoTracking()”。
您是否曾尝试将您的实体标记为已修改,然后将其附加到上下文?
像这样:
public bool Update(TEntity entity)
{
var entry = context.Entry(entity);
if (entry.State == EntityState.Detached || entry.State == EntityState.Modified)
{
entry.State = EntityState.Modified; //do it here
context.Set<TEntity>().Attach(entity); //attach
context.SaveChanges(); //save it
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30123 次 |
| 最近记录: |