Раздражающая ошибка при попытке создать новую связь для существующих записей

У меня есть довольно простая связь «многие ко многим», установленная в моей БД, из которой мне удалось создать

введите здесь описание изображения

Где мне нужно иметь возможность создавать отношения между пользователями и заказами (назначать пользователей заказам).

Вроде бы все хорошо, но когда я пытаюсь позвонить

db.Orders.Add(order);

// Set all attached users to unchanged
db.ChangeTracker.Entries<AspNetUser>().ToList()
    .ForEach(t => t.State = System.Data.Entity.EntityState.Unchanged);

try
{
    db.SaveChanges();
}

Я получаю эту досадную ошибку

«Произошла ошибка при сохранении сущностей, которые не раскрывают свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение null, поскольку одиночная сущность не может быть идентифицирована как источник исключения. Обработка исключений во время сохранения может быть упрощена путем предоставления внешних ключевые свойства в ваших типах сущностей. Подробнее см. InnerException».

С innerException

"Недопустимое имя объекта" dbo.OrderAspNetUsers".

Я создал OrderAspNetUsers с помощью

CREATE TABLE [dbo].[OrdersAspNetUsers] (
    [AspNetUserId]     nvarchar(128) NOT NULL FOREIGN KEY references [dbo].[AspNetUsers],
    [OrderId]    INT NOT NULL FOREIGN KEY references [dbo].[Orders],
    primary key (AspNetUserId, OrderId)
)

Я заметил, что странная ошибка выше ссылается на недопустимое имя объекта OrderAspNetUsers, но таблица в моей БД определенно называется OrdersAspNetUsers.

Это какая-то странная проблема с множественным числом?

Любая помощь или совет очень ценятся, я действительно понятия не имею, что здесь делать.


person Bassie    schedule 23.11.2017    source источник
comment
Попробуйте вызвать db.SaveChanges() после запуска db.Orders.Add(order). Затем вы можете вызвать строку кода ChangeTracker и снова сохранить. Я полагаю, что вы столкнулись с проблемой параллелизма, когда вы добавляете заказ, который включает AspNetUser в качестве свойства, но затем заявляете, что он не изменился, прежде чем сохранить его. Я бы написал это как ответ, но это скорее догадка, чем ответ.   -  person sjgallen    schedule 23.11.2017
comment
@sjgallen Спасибо за ваш комментарий. Первоначально я пробовал это так, но получил "Violation of PRIMARY KEY constraint 'PK_dbo.AspNetUsers'. Cannot insert duplicate key in object 'dbo.AspNetUsers'. The duplicate key value is (3197712e-0c39-42ee-a596-6dc390898eb8).\r\nThe statement has been terminated." при вызове SaveChanges() - похоже, он пытается добавить пользователей как новые записи, но они уже существуют в БД.   -  person Bassie    schedule 23.11.2017
comment
Спасибо за попытку и добавленную информацию. Я собираюсь провести некоторое исследование ошибок, которые вы видите, и может быть несколько проблем N + 1 на всякий случай, если это ответ. Я проголосовал за вопрос, чтобы помочь вам найти ответ. Меня интересует решение.   -  person sjgallen    schedule 23.11.2017
comment
@sjgallen Большое спасибо, дайте мне знать, если я могу чем-нибудь помочь   -  person Bassie    schedule 23.11.2017
comment
Вы видели этот вопрос/ответ? stackoverflow.com/questions/7938384/. У него есть несколько возможных ответов. Второй интересный, но просмотрите их все.   -  person sjgallen    schedule 23.11.2017
comment
@sjgallen Обратите внимание, что после того, как я вручную добавил заказ без пользователей, я не могу его просмотреть, потому что Invalid column name 'AspNetUser_Id'., хотя это не имя моего столбца FK (он должен искать AspNetUserId)   -  person Bassie    schedule 23.11.2017