sql-server - 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
解决方案
我的猜测是你的
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);
推荐阅读
- node.js - mongodb - 使用 $if 运算符的 $lookup
- docker - skaffold dev 返回错误 错误 400:请求中指定的用户项目无效。,无效?
- r - 如何将大型标记化 dfm 转换为 R 中的矩阵?
- javascript - React 用不同的语言翻译两个不同的字段
- sql - 如何在sql中通过分组进行聚合
- c# - 错误 CS0119:“ServiceClient”是一种类型,在给定的上下文中无效
- python - 使用 discord.py 接受输入
- python - 无法从驼峰包python导入pascalize,depascalize
- reactjs - 如何在reactjs中为自动完成组件设置多值
- python - 从字典列表中查找字典键的频率