Sono bloccato all'operazione quando si utilizza Entity Framework Core 2 per eseguire un inserimento di una nuova entità con un'entità correlata già esistente nel database. Ad esempio, ho due oggetti con una relazione uno a molti :
public Class OrderDetail
{
public int ParentID {get;set;}
public string OrderDetailName {get;set;}
public int ProductID {get;set;}
public virtual Product ProductFK {get;set;}
}
public Class Product
{
public int ProductID {get;set;}
public string ProductName {get;set;}
public virtual Collection<OrderDetail> OrderDetails {get;set;} = new Collection<OrderDetail>();
}
Vorrei aggiungere un nuovo OrderDetail
con un Product
esistente (con productID = 3
) nel database, quindi mi comporto come:
private void AddOrderDetail(int productID)
{
OrderDetail newOrderDetail = new OrderDetail();
newOrderDetail.Name = "New OrderDetail";
// Here I have no clue what would be the correct way...Should I do
// Approach A(pick related entity from database then assign as related entity to base entity):
var ProductFromDB = DbContext.Products.SingleOrDefault(p => p.ProductID == productID);
newOrderDetail.ProductFK = ProductFromDB;
// Approach B(directly assign the foreign key value to base entity)
newOrderDetail.ProductID = productID
DbContext.SaveChange();
}
Utilizzando l'approccio (A) , il mio nuovo newOrderDetail
non è riuscito a salvare e ho esaminato la risorsa SQL, sembra che sia considerato quello che ho recuperato dal database ( ProductFromDB
) come un nuovo oggetto e stavo cercando di inserirlo di nuovo. Ritengo che sia un lavoro ridondante per la selezione di ProductFromDB
quindi assegnare all'entità inserita ...
Usando l'approccio (B) , il mio nuovo newOrderDetail
non è ancora riuscito a salvare e sto ricevendo un'eccezione come "insert Una seconda operazione avviata in questo contesto prima di un'operazione precedente completata." , questa eccezione non avviene costantemente. Ho esaminato l'SQL e ho trovato lo script SQL, eseguendolo individualmente in SQL Server ha funzionato, tuttavia quando si esegue un lato applicazione, non funziona ...
Quindi quale sarebbe il modo corretto per affrontare lo scenario sopra?
Se non hai bisogno di accedere immediatamente all'oggetto Product
completo, puoi provare a impostare solo il valore della colonna chiave esterna del tuo nuovo newOrderDetail
. Inoltre, è necessario aggiungere la nuova creazione OrderDetail
oggetto al DbContext
prima di salvare - qualcosa di simile a questo:
private void AddOrderDetail(int productID)
{
OrderDetail newOrderDetail = new OrderDetail();
newOrderDetail.Name = "New OrderDetail";
newOrderDetail.ProductID = productID
// OF COURSE, you need to ADD the newly created object to the context!
DbContext.OrderDetails.Add(newOrderDetail);
DbContext.SaveChange();
}
La prossima volta, quando recuperi effettivamente OrderDetail
, risolverà il prodotto collegato e dovresti essere a posto .:
using (var DbContext = new YourDbContext())
{
OrderDetail od = DbContext.OrderDetails.FirstOrDefault(x => x.Name = "New OrderDetail");
....
}