我有麻烦在很长一段时间。让我们想象这个例子:
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 c = new Coordinate();
c.x = 1;
c.y = 2;
然后将其添加到数据库并保存。
但是当我创造了一个星球,我做到了:
planet.coordinate = c;
然后我尝试将其添加到数据库,我有以下错误:
Microsoft.EntityFrameworkCore.dll中发生了类型为“Microsoft.EntityFrameworkCore.DbUpdateException”的异常,但未在用户代码中处理
补充信息:更新条目时出错。有关详细信息,请参见内部异常。
我知道我可以将属性public Coordinate coordinate
更改为public int coordinate_id
,但我想使用坐标模型来执行此操作。
我正在使用ASP NET CORE 1.0
坎普斯
4条答案
按热度按时间xienkqul1#
问题是此时c已经有了一个Id。
使用planet.Add,planet和所有附加到它的坐标将在您的DbSet中设置为Added,并且在调用SaveChanges时,将创建insert语句。(这里我假设您的列和Id属性上有一个自动增量)
当SaveChanges完成后,EF会看到行星在数据库中,但是刚刚添加的坐标的Id不同(它被DBMS更改了,所以现在坐标在数据库中是两次,具有两个不同的Id),所以它会认为出现了错误并抛出此异常。
如果不存在重复条目的问题,请将ID设置为null或0。否则,有两种解决方案:
或
9njqaruj2#
查看内部异常将给予您更详细地了解出了什么问题。
要做到这一点,在调试模式下,当异常显示时,单击查看详细信息,并按照树,直到您找到内部异常。
可能存在重复行、主键问题或结构问题。
cwtwac6a3#
我也遇到了同样的问题,我意识到我创建了不止一个示例来访问数据库,所以我采取的解决方案是创建一个只能进行一次访问的类。
每次访问数据库层时,我都会调用GetInstance(),如下所示:
0h4hbjxa4#
在创建post方法时,我也遇到了类似的错误,但我通过执行以下操作解决了这个问题
确保已将以下代码包含在
1.构造函数在此导入中,外键所属的接口文件