2011-08-22 32 views
2

我是实体框架的新手,我有一个关于更新表中数据的问题。实体框架 - 更新表中的一行

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

比方说,我正在更新“目录”表,它只有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; ?

+0

为什么'实体'参数没有被跟踪? –

+0

@Tauseef如果你解决了这个问题,请给出答案。我也面临同样的问题。 – ggsmartboy

回答

0

您可以用单一的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(); 
} 
+1

我仍然必须手动编写或分配全部50个字段。我想知道我可以做obj = obj而不是分配对象的每个属性。 – Tauseef

1

要做到这一点自动你很可能在这样一个项目AutoMapper

但是你必须小心,因为如果一个属性没有被传入的类别的值,它将用非值覆盖旧类别的属性,即使它不是有意的。为了解决这个问题,你将不得不使用automapper配置来正确完成投影,完全按照你的想法。

0

我不确定AutoMapper是否适合您的用途。无论如何你也可能必须指定映射。

对于你所描述的,我通常有一个方法,如在每个实体void CopyEntityFrom(Category Source)和方法,我有映射语句(如this.name = entity.name;),但我这样做不是用手而是使用MVCScaffolding或其他代码生成技术生成它们。