【问题标题】:Write to a dynamic Column in EF Database写入 EF 数据库中的动态列
【发布时间】:2019-02-24 16:32:55
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该展示更大的图景。为什么要应用这些每个属性的更新?更新说明从何而来,以何种形式出现?
  • 我正在使用 x 可编辑 js 在 razer 视图中对数据进行内联编辑。
  • 我不明白这如何让您按名称更新单个属性。我什至认为你把这种方法弄得太复杂了。
  • 这是唯一的方法......对吗? vitalets.github.io/x-editable/docs.html
  • 我无法想象任何自尊的 javascript 库都会强迫您通过名称服务器端更新单个实体属性。我不会阅读所有这些文档,但你一定做错了什么。

标签: c# entity-framework linq lambda


【解决方案1】:

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

无论如何,只要你没有,使用实体框架很容易通过名称修改属性。不需要反射,因为 EF 已经缓存了实体模型的元数据:

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

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

【讨论】:

    【解决方案2】:
                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()

    【讨论】:

    • 不要设置db.Entry(DBobj).State = EntityState.Modified。 EF 已经知道某个属性已被修改。
    • @Gert 建议采纳。感谢您的宝贵时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2023-04-01
    • 2018-07-15
    相关资源
    最近更新 更多