我正在尝试做的是能够使用复杂的对象进行检索和写回数据库。
例如,我有两个班级
[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>();
}
}
我使用下面的方法填充Parent对象
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;
}
我的问题现在我有我的填充对象,说我想对Parent进行更改,包括从Parent.Children添加/更新/删除值
这是我在更新方法上的第一次传递,但是我认识到这里存在一些问题,例如根据子ID是否为零来确定更新或插入,以及这有点冗长。< / p>
有没有方法,我是否缺少Dapper或Dapper.Contrib的一些功能,它们会提供辅助方法来简化此过程?
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;
}
答案 0 :(得分:1)
可悲的是,考虑到对这个问题的反应很差,Dapper.Contrib一般都有问题。我决定抛弃Dapper并切换到更符合我需求的ORM。感谢所有提出建议的人。