Вы получаете это исключение, потому что значения свойств forum
и user
принадлежат другому контексту Entity Framework.
При создании нового Post
вы назначаете свойство Forum
экземпляру форума. Этот экземпляр взят из ForumServices.Instance.GetById
и связан с контекстом. Затем вы добавляете объект Post
в другой контекст, экземпляр forum
теперь связан с 2 контекстами, что невозможно.
Чтобы исправить это, вы можете изменить архитектуру, чтобы использовать один контекст EF для каждого запроса. Похоже, что вы используете одноэлементное (ForumServices.Instance
), если используете ядро. net, вы должны взглянуть на то, как работает внедрение зависимостей, и использовать метод AddScoped
, чтобы иметь единственный контекст EF на все время жизни запрос. Это решение, которое я настоятельно рекомендую.
Если невозможно изменить способ создания контекста, вы можете назначить Id вместо полного объекта
return new Post
{
Title = post.Title,
Content = post.Content,
Created = now,
ForumId = forum.ForumId,
UserId = user.UserId,
IsArchived = false
};
Если это по-прежнему невозможно, вы может вернуть неотслеживаемые объекты. Это можно сделать с помощью метода AsNoTracking
или с помощью свойства QueryTrackingBehavior
контекста
context.Forums.AsNoTracking().First(f => f.ForumId == forumId);
// or
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
.