Was ich versuche, ist es, komplexe Objekte sowohl zum Abrufen als auch zum Zurückschreiben in die Datenbank verwenden zu können.
Zum Beispiel habe ich zwei Klassen
[Table("Children")]
public class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Data { get; set; }
}
[Table("Parents")]
public class Parent
{
public int Id { get; set; }
public string Data { get; set; }
public List<Child> Children { get; set; }
public Parent()
{
Children = new List<Child>();
}
}
Ich befülle das Parent-Objekt mit der folgenden Methode
public List<Parent> GetAll()
{
var parents = new List<Parent>();
using (SQLiteConnection conn = new SQLiteConnection(sqlConnectionString))
{
string sql = $@"
SELECT * From Parents;
SELECT * FROM Children;
;";
var results = conn.QueryMultiple(sql);
parents = results.Read<Parent>().ToList();
var children = results.Read<Child>();
foreach (var parent in parents)
{
parent.Children = children.Where(a => a.ParentId == parent.Id).ToList();
}
}
return parents;
}
Meine Frage jetzt, wo ich mein gefülltes Objekt habe, sage, dass ich Änderungen an Parent vornehmen möchte, einschließlich Hinzufügen / Aktualisieren / Entfernen von Werten von Parent.Children
Dies ist mein erster Durchlauf bei einer Aktualisierungsmethode, aber ich erkenne, dass es hier Probleme gibt, z. B. die Entscheidung zu aktualisieren oder einzufügen, basierend auf der Kind-ID, die Null ist oder nicht, und dies ist ein bisschen ausführlich.
Gibt es einen Weg, und fehlt mir einige Funktionen von Dapper oder Dapper.Contrib, die Hilfsmethoden bieten, um diesen Prozess zu erleichtern?
public bool Update(Parent parent)
{
bool result = true;
using (SQLiteConnection conn = new SQLiteConnection(sqlConnectionString))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
if (!conn.Update<Parent>(parent))
{
result = false;
}
foreach (var element in parent.Children)
{
if (element.Id == default(int))
{
conn.Insert<Child>(element);
}
else
{
if (!conn.Update<Child>(element))
{
result = false;
}
}
}
tran.Commit();
}
catch(Exception ex)
{
//logger.Error(ex,"error attempting update");
tran.Rollback();
throw;
}
}
}
return result;
}
Leider, angesichts wie schlecht die Antwort auf diese Frage war, und Dapper.Contrib Fragen im Allgemeinen. Ich habe beschlossen, Dapper zu verwerfen und zu einem ORM zu wechseln, der meinen Anforderungen besser entspricht. Danke für all die, die Vorschläge gemacht haben.