EF Core - оператор MERGE конфликтует с ограничением FOREIGN KEY - PullRequest
0 голосов
/ 02 мая 2018

Мне нужна помощь в понимании ошибки, возникающей при попытке обновить продукт.

Я прочитал этот похожий вопрос и попробовал принятый ответ (поместив _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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...