EF Core "Невозможно вставить строку повторяющегося ключа в объект 'dbo. [Имя таблицы]' с уникальным индексом [индекс] - PullRequest
0 голосов
/ 13 февраля 2020

У меня определены следующие объекты

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: Невозможно вставить строку с повторяющимся ключом в объект 'dbo.Products' с уникальным индексом 'IX_Products_PurchaseUnitId'. Дубликат значения ключа (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


1 Ответ

0 голосов
/ 13 февраля 2020

Я предполагаю, что ваш

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

Идентификатор по умолчанию равен нулю.

Так что ваш второй .Add / SaveChanges причиняет вам боль.

попробуйте это :

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

и

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

и попробуйте еще раз (вы сохраняете большую часть того же кода, но внесите 2 вышеуказанных изменения)

Если это не так работать.

Go к вашей базе данных и к вашей таблице в SSMS. (Sql Server Management Studio) ..

Найдите ограничение: (перебирая объекты под столом)

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