写入EF数据库中的动态列

时间:2019-02-24 16:32:56

标签: c# entity-framework linq lambda

当前,在将数据保存到数据库时,我有很多if语句,因为Column是动态变化的。如果我可以使用“名称”字符串来动态更改我也需要保存的列,那么我的代码将更加高效。

        if (String.Compare(name, "MWSAccessKeyID", StringComparison.Ordinal) == 0) 
        {               
                var DBobj = db.AccountsConfigDatas.Find(0);
                DBobj.MWSAccessKeyID = NewValue;
                db.Entry(DBobj).State = EntityState.Modified;
                db.SaveChanges();               
        }

我尝试过的事情: 我已经研究了这个主题几个小时。我相信我使用了错误的搜索字词,因为那里没有太多内容。我尝试使用LINQ中的名称字符串查找Column。

                var Column = DBobj
                            .Where(e == name)                    
                            .Select(e)
                            .FirstOrDefault();

                DBobj.Column = NewValue;
                db.Entry(DBobj).State = EntityState.Modified;
                db.SaveChanges();

社区中的任何建议或文档都将非常有帮助。

2 个答案:

答案 0 :(得分:1)

似乎X-editable迫使您按名称更新属性。在我看来,您的体系结构不应允许UI库的特质渗入应用程序代码的更深层区域。建议在控制器和DAL(或服务)之间建立一个抽象/映射层。

无论如何,只要您没有,使用Entity Framework即可轻松按名称修改属性。不需要反射,因为EF已经缓存了实体模型的元数据:

var dbObj = db.AccountsConfigDatas.Find(id);
db.Entry(dbObj).CurrentValues[propertyName] = newValue;
db.SaveChanges();               

这将通过名称更新一个属性,并将该单个属性标记为已修改,因此只有该属性才会出现在update语句中。将实体的状态设置为修改状态是一种不好的做法,因为它会生成包含其所有属性的更新语句。

答案 1 :(得分:0)

            var DBobj = db.AccountsConfigDatas.Find(0);
            var propertyInfo = DBobj.GetType().GetProperty(name); 
            propertyInfo.SetValue(DBobj, NewValue);                
            db.Entry(DBobj).State = EntityState.Modified;
            db.SaveChanges();               

文档:Type.GetProperty()