我在SQL服务器上使用Entity Framework 6和Code First。今天,我最大的惊喜是,我通过ID(在我的域中,每个对象的主键)的简单查询收到异常Sequence contains more than one element
。调试后,我发现在我的数据库中存在2个具有相同主键的相同实体。
现在,我不知道怎么会发生这种情况,但我现在最大的问题是如何解决这个问题:我不能同时删除它们,因为它们是2个用户,其中包含与之相关的重要数据。所以我试图删除一个,但是我收到一个异常,因为其他一些对象引用了这个用户(同样,我不能删除那些对象,因为它们包含重要数据)。
var users = _userService.GetAllBy().ToList();
var duplicatedUsers = users.Where(x => users.Count(y => y.Id == x.Id) > 1);
foreach (var user in duplicatedUsers)
{
try
{
dbContext.Users.Remove(user);
dbContext.SaveChanges();
}
catch (Exception e)
{
// it always enters here because of the foreign keys
}
}
基本上,由于2个相同的对象具有相同的外键,因此它们也与其他相关实体共享相同的关系。因此,我不能简单地删除其中一个,因为这会导致异常。但我也不想删除它们,因为这会导致数据丢失。有什么建议吗?
答案 0 :(得分:0)
如果sql server你可以使用窗口函数来识别一行并以那种方式删除它 - 请参阅How do I delete duplicate rows in SQL Server using the OVER clause?作为示例。或者,如果表中的列具有更多的键,则可以使用其他列来更加唯一地标识“重复”行。
如果是Oracle,你可以获得行的ROWID(只需从table_name_here t WHERE conditions_here中选择rowid,t。*),然后当找到正确的rowid时,只需执行直接的DELETE FROM table_name WHERE rowid = XYZ123