Невозможно вставить явное значение, когда IDENTITY_INSERT установлен в OFF в Entity Framework - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь добавить данные в свою базу данных и получаю эту ошибку:

Невозможно вставить явное значение для столбца идентификаторов в таблице «Условия», когда для IDENTITY_INSERT установлено значение OFF

Исключение выдается на SaveChanges(). Я уже пытался использовать [DatabaseGenerated(DatabaseGeneratedOption.Identity)] выше

public int TermId { get; set; }

и все другие идеи, которые я нашел здесь, но ничего не помогло. Я не знаю, что пытаться больше.

Это часть OnPost метода:

try
{
    int? termId;

    while ((termId = ReadTermId(ligne, worksheet)) != null)
    {
        var term = worksheet.Cell(ligne, 2).Value.ToString();
        var definition = worksheet.Cell(ligne, 3).Value.ToString();
        var listExamplesEntities = new List<Example>();

        foreach (var cell in worksheet.Cell(ligne, 4).ToString().Split("\n"))
        {
            listExamplesEntities.Add(new Example {TermId = termId.Value, LocalizationId = language, Text = cell});
        }

        var notes = worksheet.Cell(ligne, 6).Value.ToString();
        var occurence = worksheet.Cell(ligne, 7).Value.ToString();
        var roots = worksheet.Cell(ligne, 8).Value.ToString();
        var rootsEntities = new List<Root>();

        if (!string.IsNullOrWhiteSpace(roots))
        {
            var rawRoots = roots.Trim().Split("\n");

            for (int i = 0; i < rawRoots.Length; i += 2)
            {
                var description = "";

                if (i < rawRoots.Length - 1) 
                    description = rawRoots[i + 1];

                rootsEntities.Add(new Root { TermId = termId.Value, LocalizationId = language,
                                Definition = description, Word = rawRoots[0]});

                if (!string.IsNullOrWhiteSpace(description)) 
                     i++;
            }
        }

        // Create and add term
        var termEntity = new Term
                    { 
                        TermId = termId.Value
                    };

        if (db.Terms.Find(termId.Value) == null)
        {
            db.Terms.Add(termEntity);
        }
        else
        {
            db.Terms.Update(termEntity);
        }

        // Create and add termLocalization
        TermLocalization termLocalizationEntity = new TermLocalization
                    {
                        TermId = termId.Value,
                        Term = db.Terms.Find(language),
                        LocalizationId = language,
                        Localization = db.Localizations.Find(language),
                        Roots = rootsEntities,
                        Examples = listExamplesEntities,
                        Word = term,
                        Definition = definition,
                        Note = notes,
                        FirstOccurence = occurence,
                        LastUpdateDate = DateTime.Today
                    };

        if(db.TermLocalizations.SingleOrDefaultAsync(x => x.TermId == termId && x.LocalizationId == language).Result == null)
        {
            db.TermLocalizations.Add(termLocalizationEntity);
        }
        else
        {
            db.TermLocalizations.Update(termLocalizationEntity);
        }

        db.SaveChanges();

        ligne++;
    }

    Confirmation = "Le fichier a été téléchargé avec succès";
}
catch (Exception ex)
{
    Confirmation = "Fichier invalide à la ligne " + ligne;
}

А это моя Term сущность:

namespace ENAP.Domain.Entities
{
    public class Term
    {
        public int TermId { get; set; }
    }
}

1 Ответ

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

Я нашел решение своей проблемы. Это может быть не самый чистый код, но он работал просто отлично.

//Create and add term
var transaction = await db.Database.BeginTransactionAsync();

var termEntity = new Term
{
     TermId = termId.Value
};
if (db.Terms.Find(termId.Value) == null)
{
    db.Terms.Add(termEntity);
}
else
{
    db.Terms.Update(termEntity);
}
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Terms ON;");
await db.SaveChangesAsync();
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Terms OFF");

//Create and add termLocalization
TermLocalization termLocalizationEntity = new TermLocalization
{
    TermId = termId.Value,
    LocalizationId = language,
    Roots = rootsEntities,
    Examples = listExamplesEntities,
    Word = term,
    Definition = definition,
    Note = notes,
    FirstOccurence = occurence,
    LastUpdateDate = DateTime.Today
};

if (db.TermLocalizations.SingleOrDefaultAsync(x => x.TermId == termId && x.LocalizationId == language).Result == null)
{
    db.TermLocalizations.Add(termLocalizationEntity);
}
else
{
    db.TermLocalizations.Update(termLocalizationEntity);
}
await db.SaveChangesAsync();
await transaction.CommitAsync();

ligne++;
...