3

我很长一段时间都遇到了麻烦。让我们想象一下这个例子:

public class Coordinate {

     public int id {get;set;}
     public int x {get;set;}
     public int y {get;set;}
}
public class Planet {

     public int id {get;set;}
     public string name {get;set;}
     public Coordinate coordinate {get;set;}
}

我创建了两个模型,模型 Planet 具有模型 Coordinate 作为属性。现在想象一下我在代码中的某处创建了一个坐标并将其存储在数据库中。想象一下这是坐标:

Coordinate c = new Coordinate();
c.x = 1;
c.y = 2;

然后我将它添加到我的数据库并保存。

但是当我创建一个星球并且我这样做时:

planet.coordinate = c;

然后我尝试将它添加到数据库我有以下错误:

Microsoft.EntityFrameworkCore.dll 中出现“Microsoft.EntityFrameworkCore.DbUpdateException”类型的异常,但未在用户代码中处理

附加信息:更新条目时出错。有关详细信息,请参阅内部异常。

我知道我可以将属性更改为public Coordinate coordinatepublic int coordinate_id但我想使用 Coordinate 模型来执行此操作。

我正在使用 ASP NET CORE 1.0

肿块

4

3 回答 3

3

您的问题是,此时 c 已经有一个 Id。

使用planet.Add,行星及其附加的所有坐标将在您的DbSet 中设置为已添加,并且在调用SaveChanges 时,将创建插入语句。(在这里我假设您的列和您的 Id 属性自动递增)

SaveChanges 完成后,EF 会看到行星在数据库中,但是刚刚添加的坐标的 Id 不同(它是由 DBMS 更改的,所以现在坐标在您的数据库中是两次,具有两个不同的 Id),所以它会期望出现问题并抛出此异常。

当重复条目没有问题时,将 Id 设置为 null 或 0。否则,有两种解决方案:

- 只设置FK属性,不设置导航属性

或者

- 只调用一次 SaveChanges(例如,只添加行星,但是添加坐标关系修复应该导致相同的结果)

于 2016-08-03T19:31:56.173 回答
2

查看内部异常将使您更详细地了解问题所在。

为此,在调试模式下,当异常显示时。单击查看详细信息并跟随树,直到找到内部异常。

可能存在重复行、主键问题或结构问题。

于 2016-08-03T19:13:06.843 回答
0

我遇到了同样的问题,我意识到我正在创建不止一个实例来访问数据库。所以我采取的解决方案是创建一个只进行一次访问的类。

class SingletonContext {
    private static Context _context;
    public static Context GetInstance() {
        if (_context == null) {
            _context = new Context();
        }
        return _context;
    }
}

在每次访问数据库层时,我都会调用 GetInstance(),如下所示:

private static Context _context = SingletonContext.GetInstance();
于 2020-10-04T20:03:05.040 回答