Sto lavorando su un'applicazione in cui ho una relazione padre-figlio tra le tabelle User
e Orders
. Di seguito sono riportate le strutture della tabella:
Utente:
Column | DataType | Constraint
--------|-----------|-------------
UserId | int | Primary key
Username| varchar |
Email | varchar |
IsActive| bit |
Ordine:
Column | DataType | Constraint
--------|-----------|----------
OrderId | int | Primary key
UserId | int | Foreign key to User.UserId
Type | smallint |
Quantity| smallint |
Come per la funzionalità, devo aggiornare l'utente e i suoi ordini in una volta sola, dove gli ordini possono essere aggiunti, rimossi o aggiornati in modo dinamico.
Sto utilizzando Entity Framework 6.0 e non riesco a trovare alcuna soluzione migliore per aggiornare la tabella padre ( user
) e la tabella figlio ( order
) in un'unica transazione.
Qualcuno potrebbe spiegare l'approccio migliore per ottenere tale funzionalità?
Di seguito è riportato il codice che sto usando:
Si prega di prendere nota che sto usando AutoMapper per mappare Object to Entity
public bool ManageUser(UserModel userDetails, string deletedOrders)
{
var isSuccess = false;
try
{
using (var entity = new UserEntity())
{
if (userDetails.UserId == 0)
{
entity.Users.Add(Mapper.Map<User>(userDetails));
}
else
{
var userToEdit = Mapper.Map<User>(userDetails);
foreach (var item in userToEdit.Orders)
{
if (item.OrderId == 0)
{
entity.Entry(item).State = System.Data.Entity.EntityState.Added;
}
else
{
entity.Entry(item).State = System.Data.Entity.EntityState.Modified;
}
}
/***
* How to Write a code here to remove orders using deletedOrders parameter
* Note: deletedOrders contains comma separated Id of the orders which needs to be removed. e.g. "1,5,6"
****/
entity.Entry(userToEdit).State = System.Data.Entity.EntityState.Modified;
}
entity.SaveChanges();
isSuccess = true;
}
}
catch (Exception ex)
{
}
return isSuccess;
}
Nota: questo è solo un codice semplice. Ma cosa succede se avrò più tabelle figlio come Order
? Se seguissi la stessa pratica, il codice diventerebbe complesso e difficile da gestire. Quindi, cercando il miglior approccio per tali scenari.
Non è necessario effettuare un viaggio nel database per le entità che dovrebbero essere cancellate.
Se userDetails.Orders
include ordini che devono essere eliminati, si modificano i loro stati inf durante il ciclo foreach (var item in userToEdit.Orders)
in System.Data.Entity.EntityState.Deleted
.
In caso contrario, è sufficiente crearne uno con id adeguati, allegarli e quindi modificare anche EntityState
in Deleted
:
var ordersToDelete = deletedOrders.Split(new[] {','},
StringSplitOptions.RemoveEmptyEntries).Select(x => new Order
{
Id = int.Parse(x.Trim())
})
.ToList();
ordersToDelete.ForEach(o =>
entity.Entry(x).State = System.Data.Entity.EntityState.Deleted);