Наиболее вероятная причина вашей проблемы в том, что вы создаете новый экземпляр вашего контекста для операции вставки. Из-за этого этот новый контекст не только получает новый продукт, но и магазин, который получен из другого контекста, но этот новый созданный контекст не имеет ни малейшего представления, что магазин уже находится в базе данных.
Общая проблема заключается в неправильном управлении жизненным циклом контекстов вашей базы данных. Экземпляры EF связаны с контекстами, которые использовались для их получения, и вы не можете просто поместить сущность из контекста в другой контекст.
Вместо создания нового контекста в каждой из ваших операций менеджера, вы должны поделиться экземпляр контекста базы данных между несколькими менеджерами.
public class StoreManager
{
public StoreManager( Context context )
{
this.context = context;
}
public TEntity Add(TEntity entity)
{
var addedEntity = context.Entry(entity);
addedEntity.State = EntityState.Added;
context.SaveChanges();
return entity;
}
}
Оркестровка должна сначала создать контекст и убедиться, что он разделен между двумя менеджерами
var context = new DbContext();
var storeManager = new StoreManager( context );
var productManager = new ProductManager( context );
var store = storeManager.GetBy(x => x.StoreId == 1);
var product = new Product() { ProductName = "Bananas", Store = store };
productManager.Add(product);
productManager.GetAll().ForEach(x => Console.WriteLine(x.ProductName + " " +
x.Store.StoreId));
Обычно все они создаются в одной области, например, в запросе область видимости, так что один веб-запрос имеет один контекст базы данных и каждый репозиторий получает один и тот же экземпляр контекста.
Вы также можете следовать официальному учебнику .