我有以下结构,映射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
),并且每次尝试时我都会遇到相同的错误。
你知道是什么原因造成的吗?
异常消息 ( 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] 删除。
我来说两句