Sto utilizzando Entity Framework e le sue entità sono utilizzate come rappresentazione del database E oggetto aziendale.
Ciò significa che alcune entità manipolate devono sempre rimanere separate dal contesto.Prevenire Entity Framework per collegare automaticamente le entità
Sono riuscito a leggere e scrivere dati dal database ma ho un piccolo problema durante l'aggiornamento:
Ho una tabella "Stock" che è collegata a una tabella "Magazzino".
L'attuale processo è questo (semplificato, ma lo spirito resta, ci sono più campi):
- un nuovo oggetto della viene creato e suoi campi sono pieni di alcuni valori (data ...)
- il magazzino corrente (oggetto estratto per l'intera richiesta dal database) è associato all'oggetto Stock
- l'oggetto viene inviato al metodo DAL che funziona è quello di salvarlo.
- Il metodo DAL verifica se l'articolo di magazzino esiste già per il giorno (stessa data, deposito e stesso tipo) nel database
- Se esiste, il metodo aggiorna il volume dall'oggetto estratto e salva le modifiche.
- Altrimenti, viene inserito il nuovo oggetto Stock.
Il problema qui è che quando creo il nuovo Stock oggetto e associarlo al magazzino, l'EntityState oggetto viene automaticamente impostato su "Aggiunto". Quindi quando eseguo SaveChanges() e lo Stock esiste già, la riga viene aggiornata E viene aggiunta una nuova riga Stock ...
Quello che vorrei è mantenere il nuovo oggetto Stock scollegato finché non lo allego da solo. Non voglio che accada automaticamente.
L'unica soluzione che ho trovato è staccare il nuovo oggetto dal contesto prima di salvare se l'oggetto esiste già.
Potrei anche staccare() l'oggetto Warehouse ma questa non è una soluzione soddisfacente Penso che nel caso reale ci siano più elementi da associare e non sono sicuro che sia una buona idea giocare con Attach() e Detach() su di essi.
In questo caso, finché non lo aggiungo al contesto, l'oggetto è solo un oggetto "Trasporto" e mi piacerebbe che rimanesse fuori dal contesto.
Qualche idea su come mantenere l'oggetto Stock distaccato?
codice (potrebbe essere un po 'scorretto, ho scritto a memoria):
Stock stk = new Stock();
stk.Date = DateTime.Now;
stk.Volume = 100; //so far stk is "Detached" and that's cool.
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool.
DAL.Stock.Instance.Save(stk);
In Save():
var existing = (from s in Context.CurrentContext.Stock
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2
select s).FirstOfDefault();
if(existing != null)
{
existing.Volume = stk.Volume;
Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!!
}
else
{
Context.CurrentContext.AddToStock(stk); //what I would want to do.
}
Context.CurrentContext.SaveChanges()
Lo stesso per me! L'hai capito? –
Purtroppo no.E non ricordo la soluzione che ho usato. Penso di aver iniziato a usare oggetti POCO. –