【问题标题】:Entity Framework - Update a row in a table实体框架 - 更新表中的一行
【发布时间】:2011-08-22 15:39:42
【问题描述】:

我是 Entity Framework 的新手,我有一个关于更新表中数据的问题。

目前,我正在使用以下方法更新数据,如果有人可以帮助我,我正在寻找更好的方法。

假设我正在更新“类别”表,它只有 3 个字段(id、名称、存档)

private void UpdateCategory(category entity)
{
    category  catObj = context.category.find(e=> e.id == id);
    catObj.name = entity.name;
    catObj.archived = entity.archived;
    context.savechanges();
}

我的问题是,如果类别表中有 50 个字段,我将不得不单独分配每个字段。我不能做这样的事情吗.. catObj = entity; ?

【问题讨论】:

  • 为什么entity参数没有被跟踪?
  • @Tauseef 如果你解决了这个问题,请回答。我也面临同样的问题。

标签: c# frameworks ado.net entity


【解决方案1】:

要自动执行此操作,您可以使用诸如AutoMapper 之类的项目。

但是你必须小心这一点,因为如果一个属性没有被传入的类别的值,它会用非值覆盖旧类别的属性,即使它不是有意的。为了解决这个问题,您必须使用自动映射器配置来正确地进行投影,完全按照您的需要。

【讨论】:

    【解决方案2】:

    您可以使用单个 LINQ 操作更改集合的所有成员的属性:

    collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();
    

    所以:

    private void UpdateCategory(category entity)
    {
        category  catObj = context.category.find(e=> e.id == id);
        catObj.Select(c=> {c.name = entity.name; c.archived = entity.archived; return c;}).ToList();
        context.savechanges();
    }
    

    【讨论】:

    • 我仍然必须手动编写或分配所有 50 个字段。我想知道我可以做 obj = obj 而不是分配对象的每个属性。
    【解决方案3】:

    我不确定 AutoMapper 是否适合您的目的。此外,您可能还必须指定映射。

    对于您所描述的,我通常在每个实体中都有一个诸如 void CopyEntityFrom(Category Source) 之类的方法,并且在该方法中,我有映射语句(例如 this.name = entity.name; )但是我不是手动执行此操作,而是使用 MVCScaffolding 或其他方法生成它们代码生成技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多