giovedì 19 gennaio 2012

Linq To Sql. Delete Parent and Child part 1

Questa cosa secondo me non l'hanno gestita bene, o non l'ho gestita bene io.
Di contro mi aspettavo qualcosa di utile come una delete condizionale.

static void Main(string[] args)
{
PmPlusDataContext pm = new PmPlusDataContext();

pm.Fornitoris.InsertOnSubmit(new Fornitori() {
Indirizzo = "via Dei Dati sporchi",
Ragione_Sociale = "Linq To Sql",
Recapito_Mail = "info@microsoft.com",
Recapito_Mobile = "00 00 000000",
Riferimento = "Gugliemo Cancelli",
Telefono_Sede = "00 000 0000 00" });

// Effettivo inserimento
pm.SubmitChanges();

// senza submit il dato non è fisicamente scritto su db
// di contro questa fallisce
var fx = pm.Fornitoris.Single(
f => f.Ragione_Sociale == "Linq To Sql"
);

fx.Risorses.Add(new Risorse() {
Cognome = "Risorsa",
Nome = "Umana 1",
CostoGiorno = 120,
CostoOra = 10,
idAmbitoDefault = 0,
idRisorsa = 1,
idRuoloDefault = 0 });

fx.Risorses.Add(new Risorse(){
Cognome = "Risorsa",
Nome = "Umana 2",
CostoGiorno = 120,
CostoOra = 10,
idAmbitoDefault = 0,
idRisorsa = 1,
idRuoloDefault = 0 });

fx.Risorses.Add(new Risorse() {
Cognome = "Risorsa",
Nome = "Umana 3",
CostoGiorno = 120,
CostoOra = 10,
idAmbitoDefault = 0,
idRisorsa = 1,
idRuoloDefault = 0
});

Console.WriteLine("Risorse prima della commit:" +
pm.Risorses.Count().ToString());

// come per il fornitore solo così salviamo il dato
pm.SubmitChanges();

Console.WriteLine("Risorse dopo la commit:" +
pm.Risorses.Count().ToString());



// cosa non troppo elegante ..
// mi aspettavo una delete con condizione...
var res = pm.Risorses.Where(r => r.idFornitore == fx.idFornitore);
foreach (Risorse r in res)
pm.Risorses.DeleteOnSubmit(r);

// sempre peggio
pm.Fornitoris.DeleteOnSubmit(fx);


Console.WriteLine("Risorse dopo la delete:" +
pm.Risorses.Count().ToString());

pm.SubmitChanges();

Console.WriteLine("Risorse dopo la commit:" +
pm.Risorses.Count().ToString());
Console.ReadKey();
}


Di contro benchè si tratti di un banale esempio .. giusto per comprendere il funzionamento di LinqToSql ( fatta eccezione per la ridicola "S" in coda ad ogni tabella... mi sarei atteso qualcosa di più "ehm" vicino all' Sql.

var res = fx.Risorses.ToList();

// e questo dove lo mettiamo ??
foreach (Risorse r in res)
pm.Risorses.DeleteOnSubmit(r);

Console.WriteLine("Risorse dopo la delete:" +
pm.Risorses.Count().ToString());

// sempre peggio
pm.Fornitoris.DeleteOnSubmit(fx);


Tuttavia si può optare anche per questa soluzione che forse sembra migliore, tuttavia rimango decisamente colpito dall'assenza di una "condizionale" per la Delete.

Magari in futuro .. non si sa mai che qualcosa arrivi..

Nessun commento: