C# 无法使用实体框架修改实体
我在Web Api应用程序中使用了实体框架,如下所示:C# 无法使用实体框架修改实体,c#,.net,asp.net-mvc,entity-framework,asp.net-web-api,C#,.net,Asp.net Mvc,Entity Framework,Asp.net Web Api,我在Web Api应用程序中使用了实体框架,如下所示: [HttpPut] public System.Web.Mvc.JsonResult UpdateAccount(CollaborateurModel item) { if (ModelState.IsValid) { ApplicationUser user = UserManager.FindByIdAsync(item.id_user_fk).Result;
[HttpPut]
public System.Web.Mvc.JsonResult UpdateAccount(CollaborateurModel item)
{
if (ModelState.IsValid)
{
ApplicationUser user = UserManager.FindByIdAsync(item.id_user_fk).Result;
user.Roles.Clear();
UserManager.AddToRoleAsync(item.id_user_fk, item.Role);
ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);
repo.UpdateCollaborateur(entity);
return new System.Web.Mvc.JsonResult { Data = true };
}
else
{
return new System.Web.Mvc.JsonResult { Data = false };
}
}
Update
方法中引发异常
未能附加实体类型“sport.DAL.Entities.ajt_collaborator”,因为相同类型的另一实体已具有此主键值。当您使用“附加”方法或将“未更改”值或“修改”设置为图元的状态时,可能会发生这种情况,无论图元是否具有图形特征键值在冲突中。有些实体可能是新的,可能没有收到任何键值由数据库生成。在这种情况下,使用“添加”方法或“添加”实体绘制图形,并将值“未更改”或“修改”分配给除新实体以外的状态实体
我需要知道
context.Entry(item.State=(item.PK==默认值(int))?添加System.Data.Entity.EntityState.Add:System.Data.Entity.EntityState.Modified代码>
(其中默认值(int)是PK的数据类型)
在您的情况下,最有可能的解决方法是确保PK/key字段甚至被发送到该方法,以便在自动映射时不会丢失该字段,或者在调用更新方法之前从数据库中重新蚀刻该项。也可能是您的项收到时没有主键,或者映射后主键可能丢失。不要填充ajt\U协作者实体,如下所示-
ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);
ajt\u合作者实体=Mapper.Map(项目);
相反,使用Find
(或Where
等)填充ajt\u协作者实体
,这样就不会有新对象,但我们可以获得实体中已经存在的现有对象),然后使用Automapper
将所有属性从项
映射到实体
。最后使用映射实体进行更新。而不是Mapper.Map(项)
你能在实体上执行查找,然后使用该对象进行更新吗?@Ramilu你的意思是找到实体,然后用CollabourModel的属性填充它,而不是使用Automapper转换它吗?这会如何改变结果?我想Mapper.Map
会给你一个新对象,然后你会将Modified
设置到这个新对象。但是已经存在具有相同id
的对象。这就是为什么你会犯这样的错误。所以做一个find
,为Mapper使用该对象。Map
将collabourmodel
属性映射到对象,然后使用它进行更新。ajt\u collaborator entity
应该由find
或where
填充,然后将所有属性从项
映射到实体
。然后将该实体用于updateGlad,我可以解决您的问题。发布与解决方案相同。collabourmodel
id属性是否与ajt\u collaborator
id同名?可能您的自动映射器配置不正确。它的名称相同,我检查主键是否传递给BLL方法,然后它是否传递给DAL方法。如果您做的一切都正确,您可以尝试使用或在设置state
attachcontext.attach(项)之前包装它代码>context.Attach(item)
在EF6中给我一个错误。我必须在前面提到实体类,例如context.Blogs.Attach(existingBlog)代码>。在我的示例中,我如何做到这一点?
public bool Update(params T[] items)
{
if (context == null) context = GetContext();
try
{
foreach (T item in items)
{
context.Entry(item).State = System.Data.Entity.EntityState.Modified;
}
context.SaveChanges();
return true;
}
catch
{
return false;
}
}
ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);