代码之家  ›  专栏  ›  技术社区  ›  Bruce Burge

使用Dapper插入和多重映射。Contrib公司

  •  3
  • Bruce Burge  · 技术社区  · 7 年前

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

    例如,我有两个班

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

    我的问题是,既然我有了填充的对象,那么我想对父对象进行更改,包括添加/更新/删除父对象中的值。儿童

    这是我第一次使用update方法,但我认识到这里存在一些问题,例如根据子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;
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Bruce Burge    7 年前

    可悲的是,考虑到对这个问题的回答是多么糟糕,而且很得体。一般问题。我决定抛弃Dapper,转而使用更适合我需要的ORM。感谢所有提出建议的人。