使用 Dapper.Contrib 插入和多重映射

Inserting and MultiMapping using Dapper.Contrib

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

比如我有两个类

[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

的 adding/updating/remove 值

这是我第一次通过更新方法,但我认识到这里存在问题,例如根据子 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;
}

可悲的是,考虑到这个问题和 Dapper.Contrib 问题的普遍反应是多么糟糕。我决定放弃 Dapper 并改用更适合我需求的 ORM。感谢所有提出建议的人。