我遇到的问题是我在使用实体时无法删除行。我能找到行,但错误我得到了下一个错误:
其他信息:存储更新,插入或删除语句 影响了意外的行数(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();
感谢所有帮助。我几个小时以来一直在敲打我的脑袋。
答案 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函数已将其设置为正确的状态。