首页 > 解决方案 > EF Core“无法在具有唯一索引 [index] 的对象 'dbo.[table name]' 中插入重复的键行

问题描述

我定义了以下实体

public class Product
{
   public int Id{get;set;}
   public int UnitOfMeasureId{get;set;}
   public UnitOfMeasure UnitOfMeasure{get;set;}
   public int SaleUnitOfMeasureId{get;set;}
   public UnitOfMeasure SaleUnitOfMeasure{get;set;}
}

public class UnitOfMeasure
{
   public int Id{get;set;}
   public string Name{get;set;}
   public string ShortName{get;set;}
   public string Description{get;set;}
}

所以,我在数据库中有各种 UnitOfMeasure 行。我插入了一个产品,一切都很好。尝试插入第二个产品并引发以下异常时会出现问题:

SqlException:无法在具有唯一索引“IX_Products_PurchaseUnitId”的对象“dbo.Products”中插入重复的键行。重复键值为 (1)。该语句已终止。

为什么会这样?

// inserting UnitOfMeasure
var uoms = new List<UnitOfMeasure>
{
  new UnitOfMeasure {Name="Kilogram", ...},
  new UnitOfMeasure {Name="Ounce",...}
}

foreach(var uom in uoms)
  _dbcontext.Add(uom);
_dbcontext.SaveChanges();

// Inserting Product
var product = new Product(UnitOfMeasureId = 1, SaleUnitOfMeasureId = 1);
dbcontext.Add(product);
dbcontext.SaveChanges();

// this operation throws the exception
var otherProduct = new Product(UnitOfMeasureId = 1, SaleUnitOfMeasureId =1);
dbcontext.Add(otherProduct);
dbcontext.SaveChanges(); // this line throws the exception

// Offending table constraint

ALTER TABLE [dbo].[Products]  WITH CHECK ADD  CONSTRAINT [FK_Products_UnitsOfMeasure_SaleOfMeasureUnitId] FOREIGN KEY([SaleUnitOfMeasureId])

REFERENCES [dbo].[UnitsOfMeasure] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Products] CHECK CONSTRAINT [FK_Products_UnitsOfMeasure_SaleUnitId]
GO


标签: sql-serverasp.net-coreentity-framework-core

解决方案


我的猜测是你的

public class Product
{
    public int Id{get;set;}

Id 默认为零。

所以你的第二个 .Add/SaveChanges 在那里伤害了你。

尝试这个:

var product = new Product(Id = 111, UnitOfMeasureId = 1, SaleUnitOfMeasureId = 1);

var otherProduct = new Product(Id = 222 ,UnitOfMeasureId = 1, SaleUnitOfMeasureId =1);

再试一次(你保留大部分相同的代码..但进行上述 2 项更改)

如果这不起作用。

转到您的数据库和 SSMS 中的表。(Sql Server 管理工作室)..

找到约束:(通过在桌子下的物体周围钓鱼)

IX_Products_PurchaseUnitId

右键单击并执行

“脚本键(或约束)输出”/“创建到”/“剪贴板”

,并将其粘贴到您的原始问题中。这将有助于很快解决问题。

如果您没有数据库访问权限,则必须“玩弄”这些值以尝试找出索引的组成部分。

提示,不要使用模棱两可的值。

试试这个:(对 SaleUnitOfMeasureId 重复相同的值,又名 444)

var product = new Product(UnitOfMeasureId = 333, SaleUnitOfMeasureId = 444);

var otherProduct = new Product(UnitOfMeasureId = 555, SaleUnitOfMeasureId =444);

然后试试这个:

试试这个:(对 UnitOfMeasureId 重复相同的值,又名 777)

var product = new Product(UnitOfMeasureId = 777, SaleUnitOfMeasureId = 888);

var otherProduct = new Product(UnitOfMeasureId = 777, SaleUnitOfMeasureId =999);

推荐阅读