Создайте Как добавить запись с объектом зависимости с помощью Entity Framework Core? ⇐ C#
Создайте Как добавить запись с объектом зависимости с помощью Entity Framework Core?
Я изучаю Entity Framework Core версии 8, используя проект Blazor. Сценарий довольно простой: мне нравится создавать простой блог. У меня есть объект Article, который имеет 2 свойства ICollection: Category и Tags
[Таблица("Статьи")] общественный класс Артикул: Стол { [JsonPropertyName("тело")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] общедоступная строка? Тело {получить; набор; } публичный ICollection? Категории {получить; набор; } публичный ICollection? Теги {получить; набор; } } Затем класс Категория определяется следующим образом (Тег аналогичен)
[Таблица("tbl_Categories")] общественный класс Категория: Стол { общедоступная строка? Имя {получить; набор; } публичный ICollection? Статьи { получить; набор; } } В базе данных у меня есть 3 таблицы: Статьи, Категории, и EF генерирует связанную таблицу с именем ArticleCategory. Эта таблица является связующим звеном между двумя основными таблицами, но в моем коде нет ее представления.
Проблема возникает, когда я хочу обновить объект Article. Если я передам существующие значения для Категории, я получу эту ошибку
Произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): нарушение ограничения PRIMARY KEY «PK_ArticleCategory». Невозможно вставить дубликат ключа в объект «ArticleCategory». Повторяющееся значение ключа: (8, 15).
Итак, я думаю, мне сначала нужно удалить эту таблицу. Я написал этот код, чтобы удалить записи в таблице ссылок и затем вызвать обновление.
public void DeleteCategoriesByArticle (длинный идентификатор) { вар статья = localDb?.Статьи? .Include(a => a.Categories)? .Where(a => a.ID == id) .FirstOrDefault(); если (статья != ноль) { bool hasChanges = ложь; if (article.Categories != null && Article.Categories.Count() > 0) { статья.Категории?.Очистить(); имеетИзменения = Истина; } если (имеетИзменения) localDb?.SaveChanges(); } } После этого я вызываю функцию обновления. В этом случае я получаю еще одну ошибку
Экземпляр сущности типа «Статья» не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'ID'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.
После быстрого поиска я изменил способ получения записи
vararticle = localDb?.Articles? .AsNoTracking() .Include(a => a.Categories)? .Where(a => a.ID == id) .FirstOrDefault(); Теперь я не получаю ошибку Нарушение PRIMARY KEY, как раньше.
Как мне тогда обновить запись Статья?
Я изучаю Entity Framework Core версии 8, используя проект Blazor. Сценарий довольно простой: мне нравится создавать простой блог. У меня есть объект Article, который имеет 2 свойства ICollection: Category и Tags
[Таблица("Статьи")] общественный класс Артикул: Стол { [JsonPropertyName("тело")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] общедоступная строка? Тело {получить; набор; } публичный ICollection? Категории {получить; набор; } публичный ICollection? Теги {получить; набор; } } Затем класс Категория определяется следующим образом (Тег аналогичен)
[Таблица("tbl_Categories")] общественный класс Категория: Стол { общедоступная строка? Имя {получить; набор; } публичный ICollection? Статьи { получить; набор; } } В базе данных у меня есть 3 таблицы: Статьи, Категории, и EF генерирует связанную таблицу с именем ArticleCategory. Эта таблица является связующим звеном между двумя основными таблицами, но в моем коде нет ее представления.
Проблема возникает, когда я хочу обновить объект Article. Если я передам существующие значения для Категории, я получу эту ошибку
Произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении. ---> Microsoft.Data.SqlClient.SqlException (0x80131904): нарушение ограничения PRIMARY KEY «PK_ArticleCategory». Невозможно вставить дубликат ключа в объект «ArticleCategory». Повторяющееся значение ключа: (8, 15).
Итак, я думаю, мне сначала нужно удалить эту таблицу. Я написал этот код, чтобы удалить записи в таблице ссылок и затем вызвать обновление.
public void DeleteCategoriesByArticle (длинный идентификатор) { вар статья = localDb?.Статьи? .Include(a => a.Categories)? .Where(a => a.ID == id) .FirstOrDefault(); если (статья != ноль) { bool hasChanges = ложь; if (article.Categories != null && Article.Categories.Count() > 0) { статья.Категории?.Очистить(); имеетИзменения = Истина; } если (имеетИзменения) localDb?.SaveChanges(); } } После этого я вызываю функцию обновления. В этом случае я получаю еще одну ошибку
Экземпляр сущности типа «Статья» не может быть отслежен, поскольку другой экземпляр с тем же значением ключа для {'ID'} уже отслеживается. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.
После быстрого поиска я изменил способ получения записи
vararticle = localDb?.Articles? .AsNoTracking() .Include(a => a.Categories)? .Where(a => a.ID == id) .FirstOrDefault(); Теперь я не получаю ошибку Нарушение PRIMARY KEY, как раньше.
Как мне тогда обновить запись Статья?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение