3

我正在尝试做的是能够使用复杂的对象进行检索和写回数据库。

例如,我有两个班级

[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>();
    }
}

我使用下面的方法填充父对象

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 是否为零来确定更新或插入,以及这有点冗长。

有没有办法,我是否缺少 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;
}
4

1 回答 1

2

可悲的是,考虑到对这个问题的回答有多差,而且 Dapper.Contrib 的问题一般。我决定放弃 Dapper 并改用更适合我需求的 ORM。感谢所有提供建议的人。

于 2017-11-13T01:31:14.840 回答