Мне нужна помощь в понимании ошибки, возникающей при попытке обновить продукт.
Я прочитал этот похожий вопрос и попробовал принятый ответ (поместив _context.SaveChanges()
после каждой таблицы, перед окончательным сохранением всего продукта), но я все еще получаю ту же ошибку, как описано ниже.
Это задействованные модели:
public class Product
{
public int Id { get; set; }
// some more properties
public ICollection<IdentifierForProduct> Identifiers { get; set; }
}
public class IdentifierForProduct
{
public int Id { get; set; }
public int ProductId { get; set; }
public int ProductIdentifierId { get; set; }
public string Value { get; set; } // E.g. "4902505154881"
public ProductIdentifier Identifier { get; set; }
public Product Product { get; set; }
}
public class ProductIdentifier
{
public int Id { get; set; }
public string Label { get; set; } // E.g. "EAN"
public ICollection<IdentifierForProduct> ProductIdentifiers { get; set; }
}
Первоначально после публикации формы устанавливаются Identifiers
(VMProduct
- модель вида продукта):
List<IdentifierForProduct> Identifiers = new List<IdentifierForProduct>();
if (VMProduct.Identifiers != null)
{
for (var i = 0; i < VMProduct.Identifiers.Count; i++)
{
Identifiers.Add(new IdentifierForProduct
{
ProductId = VMProduct.Id,
ProductIdentifierId = VMProduct.Identifiers[i].Id,
Value = VMProduct.Identifiers[i].Value
});
}
}
Затем свойства продукта изменяются в соответствии с изменениями, внесенными в форму:
Product DbM = await GetProduct(VMProduct.Id);
// some more properties are set
DbM.Identifiers = Identifiers;
_context.Update(DbM);
await _context.SaveChangesAsync();
Это исключение выдается await _context.SaveChangesAsync();
:
SqlException: оператор MERGE конфликтовал с ограничением FOREIGN KEY "FK_IdentifiersForProducts_ProductIdentifiers_ProductIdentifierId". Конфликт произошел в базе данных «MyStore», таблице «dbo.ProductIdentifiers», столбце «Id».
Заявление было прекращено.
System.Data.SqlClient.SqlCommand + <> c.b__108_0 (результат задачи)
DbUpdateException: при обновлении записей произошла ошибка. Смотрите внутреннее исключение для деталей.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch + d__32.MoveNext ()
Это метод GetProduct()
:
public async Task<Product> GetProduct(int Id)
{
Product DbM = await _context.Products
.Include(ic => ic.InCategories)
.ThenInclude(pc => pc.ProductCategory)
.Include(t => t.Type)
.ThenInclude(i => i.Identifiers) // ProductIdentifiersInTypes
.ThenInclude(i => i.Identifier)
.Include(t => t.Type)
.ThenInclude(p => p.Properties) // ProductPropertiesInTypes
.ThenInclude(p => p.Property)
.ThenInclude(o => o.Options)
.Include(p => p.ProductPropertyOptions)
.Where(p => p.Id == Id)
.SingleOrDefaultAsync();
return DbM;
}