实体框架两次插入同一个实体

法罗

我有以下结构,映射Entity Framework 6使用Database First principle

在此处输入图片说明

这是源数据库:

CREATE TABLE `Foo` (
  `Guid` VARCHAR(36),
  `Name` VARCHAR(500) NOT NULL,
  `Author` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`Guid`),
  UNIQUE KEY `unique_fooname` (`Name`,`Author`));

CREATE TABLE `FooVersion` (
  `Guid` VARCHAR(36),
  `Version` INT,
  `RefFooGuid` VARCHAR(36) NOT NULL,
  PRIMARY KEY (`Guid`),
  UNIQUE KEY `unique_fooversion` (`Version`,`RefFooGuid`),
  CONSTRAINT `fk_foo_version`
    FOREIGN KEY (`RefFooGuid`)  
    REFERENCES `Foo` (`Guid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

CREATE TABLE `FooVersionPart` (
  `Name` VARCHAR(250) NOT NULL,
  `RefFooVersionGuid` VARCHAR(36) NOT NULL,
  PRIMARY KEY (`Name`, `RefFooVersionGuid`),
  INDEX `fk_fooversion_fooversionpart_idx` (`RefFooVersionGuid` ASC),
  CONSTRAINT `fk_fooversion_fooversionpart`
    FOREIGN KEY (`RefFooVersionGuid`)
    REFERENCES `FooVersion` (`Guid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

在我的代码中,我正在创建一个新的 foo ,如下所示:

var dbContext = new DbContext();
var newVersion = new FooVersion();

newVersion.Guid = Guid.NewGuid().ToString()
newVersion.Parts = sourceParts.Select(s => new FooVersionPart
{
    Name = s.Name,
    RefFooVersionGuid = newVersion.Guid
}.ToList(); 

var foo = new Foo
{
    Author = "Me"
    Guid = Guid.NewGuid().ToString(),
    Name = "Foo"
};

dbContext.Foos.Add(foo);

foo.Versions.Add(newVersion);

dbContext.SaveChanges();

我在以下过程中收到以下错误SaveChanges

密钥“PRIMARY”的重复条目“dim.proran.db.tmp.dataCallistHDay -9e6620f4-227d-44de-b781-5fd67”

当 EF 尝试插入 FooVersionPart 之一(dim.proran.db.tmp.dataCallistHDay是该Name部分的 并且9e6620f4-227d-44de-b781-5fd67是该部分的 - 截断RefFooVersionGuid - )时,会更具体地发生错误

我绝对确定sourceParts没有重复,也没有在数据库中。

这是生成的 SQL:

插入Foo[..];

插入FooVersion[..];

插入FooVersionPart[..];

插入FooVersionPart[..];

插入FooVersionPart[..];

插入FooVersionPart[..];

等等

异常总是发生在同一个FooVersionPart( dim.proran.db.tmp.dataCallistHDay) 上。它是 2435 的第 1910 个元素。因此 EF 不会尝试将所有部分插入两次,只是在中间插入一个。

最奇怪的是,它在不久前工作了,并且在所有相关内容都没有更改的情况下不再工作了(架构没有更改,库没有更新,代码没有更改)。它在我的环境之一中运行良好,并且在我的开发环境中不适用于相同的代码。

最后一件事,它不是特定于该 Guid。每次尝试时,Guid 都是不同的(不是其他输入,所以它仍然失败dim.proran.db.tmp.dataCallistHDay),并且每次尝试时我都会遇到相同的错误。

你知道是什么原因造成的吗?

大卫·G

异常消息 ( Duplicate entry 'dim.proran.db.tmp.dataCallistHDay -9e6620f4-227d-44de-b781-5fd67' for key 'PRIMARY') 与它所引用的表的主键( ) 相结合,PRIMARY KEY ('Name', 'RefFooVersionGuid')告诉我们您正在尝试向表中插入重复数据,特别是多个FooVersionPart具有相同名称的 s。

现在您说您对源数据进行了重复检查,但您可能不知道很多(全部?)SQL 数据库不将尾随空格计为记录的一部分。例如,这个查询实际上会返回一条记录:

SELECT 1 
WHERE 'abc' = 'abc        '

因此,正如您所确认的,您的数据确实有重复项,它们不会被 C# 发现,GroupBy但会被数据库引擎捕获。一个简单的解决方案是在分组之前修剪数据,这是一个很好的习惯,尤其是手动输入的数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架实体两次引用另一个

来自分类Dev

冬眠。同一实体何时可以在一个会话中加载两次?

来自分类Dev

两个不同的实体引用同一个实体 Ef Core

来自分类Dev

使用实体框架代码优先从同一个父表中获得两个外键,而无需在父实体上指定集合

来自分类Dev

无法基于两个条件两次 JOIN 同一个表

来自分类Dev

实体框架多个外键指向同一个表

来自分类Dev

在实体框架中,如何处理同一个类的多个外键

来自分类Dev

实体框架到同一个表的多个外键

来自分类Dev

实体框架 - 无法创建多个引用同一个表的 DbContext。- 解决方法

来自分类Dev

对同一个幻像实例使用两次createPage()

来自分类Dev

SQL查询,使用同一个表两次

来自分类Dev

在Ruby中两次定义同一个类

来自分类Dev

在同一个ForeignKey上加入两次

来自分类Dev

如何模拟 Dao 两次但被同一个 Object 调用?

来自分类Dev

将同一个被测设备实例化两次

来自分类Dev

避免在 Spring Batch 中两次处理同一个文件

来自分类Dev

在 PHP 中对同一个 mysql 查询迭代两次

来自分类Dev

两次加入同一个父表的 SQL 查询

来自分类Dev

Airflow 两次执行同一个操作符

来自分类Dev

如何避免加入同一个维度表两次

来自分类Dev

MongoDb,防止两次创建同一个对象

来自分类Dev

如何两次加入同一个表

来自分类Dev

使用C#实体框架查找值在同一个对象上触发If和Else

来自分类Dev

两次插入密钥后重试实体框架DbContext.SaveChanges

来自分类Dev

如果您在两次部署在Tomcat中的战争中两次拥有同一个班级,将会发生什么?

来自分类Dev

如果您在两次部署在tomcat的战争中两次拥有同一个班级,将会发生什么情况?

来自分类Dev

java中同一个线程调用start()方法两次,有时执行run()方法两次;内部究竟发生了什么?

来自分类Dev

如何在詹金斯的同一个奴隶上同时启动工作两次?

来自分类Dev

有什么办法可以在Kotlin中两次从同一个通用接口继承(使用单独的类型)?

Related 相关文章

  1. 1

    实体框架实体两次引用另一个

  2. 2

    冬眠。同一实体何时可以在一个会话中加载两次?

  3. 3

    两个不同的实体引用同一个实体 Ef Core

  4. 4

    使用实体框架代码优先从同一个父表中获得两个外键,而无需在父实体上指定集合

  5. 5

    无法基于两个条件两次 JOIN 同一个表

  6. 6

    实体框架多个外键指向同一个表

  7. 7

    在实体框架中,如何处理同一个类的多个外键

  8. 8

    实体框架到同一个表的多个外键

  9. 9

    实体框架 - 无法创建多个引用同一个表的 DbContext。- 解决方法

  10. 10

    对同一个幻像实例使用两次createPage()

  11. 11

    SQL查询,使用同一个表两次

  12. 12

    在Ruby中两次定义同一个类

  13. 13

    在同一个ForeignKey上加入两次

  14. 14

    如何模拟 Dao 两次但被同一个 Object 调用?

  15. 15

    将同一个被测设备实例化两次

  16. 16

    避免在 Spring Batch 中两次处理同一个文件

  17. 17

    在 PHP 中对同一个 mysql 查询迭代两次

  18. 18

    两次加入同一个父表的 SQL 查询

  19. 19

    Airflow 两次执行同一个操作符

  20. 20

    如何避免加入同一个维度表两次

  21. 21

    MongoDb,防止两次创建同一个对象

  22. 22

    如何两次加入同一个表

  23. 23

    使用C#实体框架查找值在同一个对象上触发If和Else

  24. 24

    两次插入密钥后重试实体框架DbContext.SaveChanges

  25. 25

    如果您在两次部署在Tomcat中的战争中两次拥有同一个班级,将会发生什么?

  26. 26

    如果您在两次部署在tomcat的战争中两次拥有同一个班级,将会发生什么情况?

  27. 27

    java中同一个线程调用start()方法两次,有时执行run()方法两次;内部究竟发生了什么?

  28. 28

    如何在詹金斯的同一个奴隶上同时启动工作两次?

  29. 29

    有什么办法可以在Kotlin中两次从同一个通用接口继承(使用单独的类型)?

热门标签

归档