EF Core объект не добавлен в базу данных - PullRequest
0 голосов
/ 02 мая 2018

Мои объекты не добавляются в конкретную таблицу.

Хотя все остальные таблицы работают отлично, у меня есть конкретная таблица, которой нет, и я не могу понять, почему. В той же последовательности у меня есть различные добавления / обновления до SaveChangeAsync, каждый запрос работает нормально, за исключением одной таблицы, в которой не добавляются объекты.

Я проверил объект, его данные хорошо заполнены.

После некоторых исследований того, почему у меня не было данных в этой таблице, я использовал непосредственное окно для выполнения некоторых тестов, вот что я получаю для последовательности:

  1. Подсчет из таблицы
  2. Добавить объект
  3. Сохранить DBContext
  4. Подсчет из таблицы

Количество

_DbContext.Attendees.Count()
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Attendees] AS [e]
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Message","time":"2018-05-02T11:39:35.5327129Z","tags":{"ai.operation.parentId":"|d06def47-4faba4501b66147c.","ai.operation.id":"d06def47-4faba4501b66147c","ai.location.ip":"127.0.0.1","ai.operation.name":"POST Order/VerifyPayment [cartId]","ai.application.ver":"1.0.0.0","ai.internal.nodeName":"MyPC","ai.cloud.roleInstance":"MyPC","ai.internal.sdkVersion":"aspnet5c:2.1.1"},"data":{"baseType":"MessageData","baseData":{"ver":2,"message":"Executed DbCommand (17ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\r\nSELECT COUNT(*)\r\nFROM [Attendees] AS [e]","severityLevel":"Information","properties":{"{OriginalFormat}":"Executed DbCommand ({elapsed}ms) [Parameters=[{parameters}], CommandType='{commandType}', CommandTimeout='{commandTimeout}']{newLine}{commandText}","elapsed":"17","commandTimeout":"30","commandText":"SELECT COUNT(*)\r\nFROM [Attendees] AS [e]","AspNetCoreEnv
ironment":"Development","commandType":"Text","DeveloperMode":"true","CategoryName":"Microsoft.EntityFrameworkCore.Database.Command"}}}}
0

Добавить объект

_DbContext.Attendees.Add(attendees[0])
{Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalClrEntityEntry}
    Collections: {System.Linq.Enumerable.WhereSelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.CollectionEntry>}
    Context: {Project.Data.DbContext}
    CurrentValues: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.CurrentPropertyValues}
    Entity (Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry): {Project.Models.Attendee}
    Entity: {Project.Models.Attendee}
    InternalEntry: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalClrEntityEntry}
    IsKeySet: true
    Members: {System.Linq.Enumerable.Concat2Iterator<Microsoft.EntityFrameworkCore.ChangeTracking.MemberEntry>}
    Metadata: {EntityType: Attendee}
    Navigations: {System.Linq.Enumerable.SelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.NavigationEntry>}
    OriginalValues: {Microsoft.EntityFrameworkCore.ChangeTracking.Internal.OriginalPropertyValues}
    Properties: {System.Linq.Enumerable.SelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.IProperty, Microsoft.EntityFrameworkCore.ChangeTracking.PropertyEntry>}
    References: {System.Linq.Enumerable.WhereSelectEnumerableIterator<Microsoft.EntityFrameworkCore.Metadata.INavigation, Microsoft.EntityFrameworkCore.ChangeTracking.ReferenceEntry>}
    State: Added

Сохранить изменения

_DbContext.SaveChanges()
0

Количество таблиц

_DbContext.Attendees.Count()
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*)
FROM [Attendees] AS [e]
Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.Message","time":"2018-05-02T11:40:05.8741131Z","tags":{"ai.operation.parentId":"|d06def47-4faba4501b66147c.","ai.operation.id":"d06def47-4faba4501b66147c","ai.location.ip":"127.0.0.1","ai.operation.name":"POST Order/VerifyPayment [cartId]","ai.application.ver":"1.0.0.0","ai.internal.nodeName":"MyPC","ai.cloud.roleInstance":"MyPC","ai.internal.sdkVersion":"aspnet5c:2.1.1"},"data":{"baseType":"MessageData","baseData":{"ver":2,"message":"Executed DbCommand (19ms) [Parameters=[], CommandType='Text', CommandTimeout='30']\r\nSELECT COUNT(*)\r\nFROM [Attendees] AS [e]","severityLevel":"Information","properties":{"{OriginalFormat}":"Executed DbCommand ({elapsed}ms) [Parameters=[{parameters}], CommandType='{commandType}', CommandTimeout='{commandTimeout}']{newLine}{commandText}","elapsed":"19","commandTimeout":"30","commandText":"SELECT COUNT(*)\r\nFROM [Attendees] AS [e]","AspNetCoreEnv
ironment":"Development","commandType":"Text","DeveloperMode":"true","CategoryName":"Microsoft.EntityFrameworkCore.Database.Command"}}}}
0

Как мы можем наблюдать, сущность успешно прикреплена, но при сохранении ничего не происходит ... Что может вызвать это? Он объявлен как любая другая таблица. Он имеет идентификатор Guid Id в качестве ключа, который устанавливается на стороне кода

Дополнительная информация

_DbContext.ChangeTracker.Entries<Attendee>().Count() => 1

и

_DbContext.ChangeTracker.Entries<Attendee>().ElementAt(0).Entity

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

После Save Entries.Count возвращает 0, но ничего не было добавлено ...

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

_DbContext.Attendees.FirstOrDefault() выполняет оператор SQL и возвращает значение null, как и ожидалось, поскольку в БД нет записи.

Если я сделаю _DbContext.Attendees.Add(new Attendee(){Id=Guid.NewId()}), это сработает ... Я начну оттуда ...

1 Ответ

0 голосов
/ 02 мая 2018

Каким-то образом это ломалось, потому что между вызовами Add и UPDATE было SELECT операторов (ToListAsync и FirstOrDefaultAsync). Одно из Add утверждений где-то потерялось, и я не мог найти почему.

Мое решение состояло в том, чтобы создать новый DbContext и сохранить на этом DbContext только SELECT операторы, которые требовались для обновления некоторых объектов и перемещения этих SELECT в качестве первых операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...