无法使用实体框架删除行

时间:2016-06-23 06:30:18

标签: c# sql entity-framework

我遇到的问题是我在使用实体时无法删除行。我能找到行,但错误我得到了下一个错误:

  

其他信息:存储更新,插入或删除语句   影响了意外的行数(0)。实体可能已经存在   自实体加载后修改或删除。看到   http://go.microsoft.com/fwlink/?LinkId=472540了解有关的信息   理解和处理乐观并发异常。

我尝试在包管理器控制台中更新数据库,我尝试了几种不同的删除记录的方法,但目前没有运气。已启用自动迁移。

以下是我目前正在尝试使用的代码。

   var ctx = new Context();
   ApplicationUser user = new ApplicationUser { UserName = myUsername };
   ctx.Users.Attach(user);
   ctx.Users.Remove(user);
   ctx.Entry(user).State = EntityState.Modified;
   ctx.SaveChanges();

感谢所有帮助。我几个小时以来一直在敲打我的脑袋。

3 个答案:

答案 0 :(得分:2)

在EF中删除实体的常用方法如下:

  • 使用DbSet<T>定位实体。这可以是从集合中检索实体或将其附加到集合;
  • 致电DbSet<T>.Remove;
  • 致电DbContext.SaveChanges

由于ApplicationUser.UserName不是主键属性,因此您需要查找实体。附加在这里没有意义 - DbSet<T>.Attach告诉上下文将给定主键的实体视为现有和未修改,但是你没有设置主键值(可能,它是在构造函数中生成的,因为你'重新使用GUID?)。

这样的事情:

// assuming, that user names are not unique
var user = ctx.Users.FirstOrDefault(_ => _.UserName == myUsername);
if (user != null)
{
    ctx.Users.Remove(user);
    cts.SaveChanges();
}

答案 1 :(得分:0)

您删除了您的实体,之后将其标记为已修改。删除行:

ctx.Entry(user).State = EntityState.Modified;

答案 2 :(得分:0)

怎么样:

   var ctx = new Context();
   ApplicationUser user = new ApplicationUser { UserName = myUsername };
   ctx.Entry(user).State = EntityState.Deleted
   ctx.SaveChanges();

或者只删除关于修改记录的行。它不是必需的,因为首先你要删除它而不是改变。其次,.Remove函数已将其设置为正确的状态。