giovedì 19 gennaio 2012

Linq To Sql. Delete Parent and Child part 2

Giusto per comprendere se qualcosa può in qualche modo spaccarsi ho voluto fare questa prova aggiungendo una SQLCommand al fine unico di comprendere come
si comportano i dati in cache ...

E Giustamente "preciso giustamente" mi ritrovo i dati anche dopo la delete...
perchè la command agisce su db, di contro LinqToSql gestisce il dato in forma
autonoma.

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.First(
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());


// flusso alternativo
SqlCommand sc = new
SqlCommand("Delete from Risorse Where idFornitore =" +
fx.idFornitore.ToString());

sc.Connection = new SqlConnection();
sc.Connection.ConnectionString = "[connetcion String]";
sc.Connection.Open();
sc.ExecuteNonQuery();
sc.Connection.Close();


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);


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

pm.SubmitChanges();

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


Di contro questa : var res = fx.Risorses.ToList();
mi restituisce 3 record ...

Ma il resto del codice non salta implica tacitamente che l'architettura o trappa l'assenza dei dati o eseguendo "una delete per id" non trovando gli elementi non impazzisce...

Ma manca ancora un test...
e se togliessimo la rimozione logica lasciando solo quella fisica ..
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.First(
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());


// flusso alternativo
SqlCommand sc = new
SqlCommand("Delete from Risorse Where idFornitore =" +
fx.idFornitore.ToString());

sc.Connection = new SqlConnection();
sc.Connection.ConnectionString = "[connetcion String]";
sc.Connection.Open();
sc.ExecuteNonQuery();
sc.Connection.Close();


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


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

pm.SubmitChanges();

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


Funziona e non si spacca !! è un filino sporca .. ma va !

Nessun commento: