| 

.NET C# Java Javascript Exception

3
Hallo,

ich habe mit meinem EF4 Programm ein kleines Problem entdeckt.
Ich habe meine DAOs geschrieben um nicht die EF abhaengigkeiten durchs ganze Programm ziehen zu muessen. Soweit funktioniert das auch ganz gut. Ich rufe mir eine Instanz einer Adresse ab und zeige diese an. Ich erzeuge eine neue Instanz von einer Adresse und gebe diese an meine DAO um die Daten zu hinzuzufuegen und zu speichern, auch kein Problem. Wo ich aber nicht genau durchsehe ist der editieren Fall bei dem System. Ich verwende meine AdresseDAO.GetAdresseBy(int id) um eine Adresse abzurufen. Wie bekomme ich die geanederte Instanz dann aber wieder zurueck in die Datenbank?

Im direkten Zugriff ja
Adresse a = new Adresse {Strasse="Test", Plz="12345"};
DbContext.Adressen.Add(a)
DbContext.SaveChanges();

Wie sage ich meinem DbContext aber nun, dass die Instanz von Adresse bereits bekannt ist.
Muss ich dazu wirklich so vorgehen?
public bool Save(Adresse a) {
var adresse = DbContext.Adressen.Where(a=>a.Id == Id).Single();
adresse = a;
DbContext.SaveChanges();
}

Wie ist hier das korrekte vorgehen?
14.04.2011
Gast
51 2
2 Antworten
0
Das kannst du so machen:
public void Update(Adresse a) 
{
using (DbContext context = new DbContext())
{
context.Adressen.Attach(a);
// Detached entities don't track changes so after attaching you have to say
// what changes have been done
context.ObjectStateManager.ChangeObjectState(a, System.Data.EntityState.Modified);
context.SaveChanges();
}
}
14.04.2011
Jürgen Luhr 7,1k 2 9
0
Das korrekte Vorgehen ist es, deinen OR-Mapper nicht zu abstrahieren, sprich keine DAOs zu verwenden, wenn Du Daten ändern willst. Du verlierst mit diesem Ansatz z.B. auch das Change Tracking von geänderten Attributen. Du solltest die generierten Entities direkt verwenden, dafür sind sie da.
14.04.2011
Marvin Steppat 4,0k 1 4 8
1
Hmm... also doch in meine Oberflaeche auch nen Verweis auf EF usw einbauen?
– Gast 14.04.2011
Jo, ist der pragmatische Ansatz. Ohne besonderen Anlass solltest Du dir die Qualen ersparen, die vor dir liegen. Denk dran, was passiert wenn Du mal updaten oder deleten willst. Der gleiche Zirkus nochmal.

Ein sogenanntes Transfer-Model brauchst Du z.B. mit Webservices, aber hier ist es unnötig, da in-process.
Marvin Steppat 15.04.2011
Das klingt mir eher nach schlimmen Prgrammierstil: http://codekicker.de/fragen/allgemein-Programmierstil-schlimmste-euch-bisher-begegnet-programmieren/1657#a5579
Ein Verweis von der GUI auf den DataAccessLayer sollte es wirklich nicht geben. Dazwischen liegt noch der BusinessLayer und dieser könnte sogar durch MEF vom DataAccessLayer entkoppelt sein. Wie ist da ein Verweis auf EF möglich? Wird irgendwann der DataAccessLayer ausgetauscht, hätte das Konsequenzen bis in die Oberfläche. Das darf nicht sein.
Die Lösung wären eher POCOs, STEs oder DTOs.
Jürgen Luhr 15.04.2011
Ich denke auch, dass es nicht unbedingt das beste System ist, wenn man in allen teilen des Programms verweise auf den DAL drin hat. Vor allem, weil ich die gleiche Komponente in verschiedenen Programmen einsetzen möchte, die auch unterschiedliche Möglichkeiten haben. Ein Teil soll per monotouch auf iOS laufen, das nächste auf WP7 und das dritte auf monodroid, dann kommt noch sowohl ein Windows als auch ein Mac Client. Und als Verbindung dazwischen eine webanwendung mit Background Service. Da gerade in letzterem Teil dann auch mehr Daten zusammenkommen werden, soll dieser Teil auch mit MySQL
csharp.dev 15.04.2011
Laufen. Wobei ich mir aktuell noch nicht ganz sicher bin in wieweit EF auf den verschiedenen mono Plattformen verwendbar ist und ggf. Dann auch dort ausgetauscht werden muss.
Wie würde ich dann am günstigsten meinen DAL abkapseln?
csharp.dev 15.04.2011
"Wie würde ich dann am günstigsten meinen DAL abkapseln?" Das würde mich auch interessieren, denn ich habe hierauf nie eine praktikable Antwort gesehen. Es kommt imho auch nie vor, dass man den DAL oder den ORM austauscht, und falls es so ist, kann man die Zusatzarbeit dann immernoch in Kauf nehmen.
Marvin Steppat 15.04.2011
Ich habe das jetzt als Frage gestellt: http://codekicker.de/fragen/architektur-abstrahiert-guenstigsten-DAL-ORM-Anwendung-orm-dal/1695
Marvin Steppat 15.04.2011

Stelle deine Framework-Frage jetzt!