使用Dapper.Contrib插入和MultiMapping

时间:2017-10-25 22:11:12

标签: c# sqlite dapper 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>();
    }
}

我使用下面的方法填充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;
}

1 个答案:

答案 0 :(得分:1)

可悲的是,考虑到对这个问题的反应很差,Dapper.Contrib一般都有问题。我决定抛弃Dapper并切换到更符合我需求的ORM。感谢所有提出建议的人。