Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 英孚核心;无法在对象';dbo.[表名]';具有唯一索引[索引]_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

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);