我在数据库中找到了两个具有相同主键的相同实体

时间:2017-03-30 18:35:35

标签: c# sql entity-framework

我在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个相同的对象具有相同的外键,因此它们也与其他相关实体共享相同的关系。因此,我不能简单地删除其中一个,因为这会导致异常。但我也不想删除它们,因为这会导致数据丢失。有什么建议吗?

1 个答案:

答案 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