Sql server 英孚核心;无法在对象';dbo.[表名]';具有唯一索引[索引]
我定义了以下实体Sql server 英孚核心;无法在对象';dbo.[表名]';具有唯一索引[索引],sql-server,asp.net-core,entity-framework-core,Sql Server,Asp.net Core,Entity Framework Core,我定义了以下实体 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;} } publ
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;}
}
所以,我在数据库中有各种度量单位行。我插入了一个产品,一切都很好。尝试插入第二个产品时出现问题,并引发以下异常:
SqlException:无法在具有唯一索引“IX\U Products\U PURCHASEUNIID”的对象“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
//插入测量单位
变量计量单位=新列表
{
新的计量单位{Name=“kg”,…},
新的计量单位{Name=“盎司”,…}
}
foreach(计量单位为计量单位的var uom)
_dbcontext.Add(计量单位);
_dbcontext.SaveChanges();
//插入产品
var产品=新产品(计量单位ID=1,销售计量单位ID=1);
添加(产品);
dbcontext.SaveChanges();
//此操作引发异常
var otherProduct=新产品(计量单位ID=1,销售计量单位ID=1);
添加(其他产品);
dbcontext.SaveChanges();//这行抛出异常
//有问题的表约束
通过选中添加约束[FK\U Products\U UNITSOFMEASUREUNID]外键([SALEUNITOOFMEASUREID])更改表[dbo].[Products]
引用[dbo].[UnitsOfMeasure]([Id])
关于删除级联
去
ALTER TABLE[dbo].[Products]检查约束[FK\U Products\U UnitsOfMeasure\U SaleUnitId]
去
我猜你的
public class Product
{
public int Id{get;set;}
Id默认为零
因此,您的第二个.Add/SaveChanges正在伤害您
试试这个:
var product = new Product(Id = 111, UnitOfMeasureId = 1, SaleUnitOfMeasureId = 1);
及
然后再试一次(您保留了大部分相同的代码..但进行了上述两项更改)
如果这不起作用
转到您的数据库和SSMS中的表。(Sql Server管理工作室)
找到约束:(通过在表下的对象周围打捞)
右键单击并执行以下操作:
“脚本键(或约束)输出”/“创建到”/“剪贴板”
,并将其粘贴到原始问题中。这将有助于更快地解决问题
如果您没有数据库访问权限,则必须对这些值进行“处理”,以尝试找出索引的组成部分
提示,不要使用不明确的值
尝试以下操作:(对SaleUnitOfMeasureId(又名444)重复相同的值)
及
然后试试这个:
尝试以下操作:(对UnitOfMeasureId(又名777)重复相同的值)
及
线索在错误消息中。您是如何生成输入数据的?如何根据主键定义类?产品和单位是如何联系在一起的。添加新数据的代码是什么?请提供示例数据、预期结果和实际代码。您编写了FK约束的脚本。它看起来不像“有问题的”IX_Products_PurchaseUnitId“约束,这是一个唯一的索引。继续在SSM中搜索。同样的错误。“Id”属性在数据库中定义为“Identity”,步骤为1时自动递增,IdentitySeed=1(这是起始值)。所以第一个产品的“Id”是1,第二个产品的“Id”是2,等等。好的,这就是和标识。所以你在那里很好。我在我的答案中添加了一个“if that not work”(如果不起作用)的附加。如果它在db中定义为identity,但ef不知道它,它将插入0。您需要告诉ef它是一个db级别的标识列。
var otherProduct = new Product(Id = 222 ,UnitOfMeasureId = 1, SaleUnitOfMeasureId =1);
IX_Products_PurchaseUnitId
var product = new Product(UnitOfMeasureId = 333, SaleUnitOfMeasureId = 444);
var otherProduct = new Product(UnitOfMeasureId = 555, SaleUnitOfMeasureId =444);
var product = new Product(UnitOfMeasureId = 777, SaleUnitOfMeasureId = 888);
var otherProduct = new Product(UnitOfMeasureId = 777, SaleUnitOfMeasureId =999);