写入EF数据库中的动态列

问题描述 投票:0回答:2

我将数据保存到数据库时目前有很多if语句,因为Column动态更改。如果我可以使用“name”字符串动态更改我需要保存的列,那么我的代码会更有效率。

        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中的名称字符串查找列。

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

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

来自社区的任何建议或文档都会非常有用。

c# entity-framework linq lambda
2个回答
1
投票

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

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

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

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


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()

© www.soinside.com 2019 - 2024. All rights reserved.