声明:如果你觉得这里的布局看着不舒服:建议你来这里阅读:Entity Framework 中如何更新表中的某个字段
通常大家特别是初学EF的朋友可能会发现EF中更新一个数据库中某个表某一列的值一般的例子中都不会有的。
大家基本上都是使用Table和View来直接整个Entity去更新。
比如:
我们更新一个实体User(包含字段:ID,FirstName,LastName)。
当然,在这个Update操作之前我们需要先插入一条数据到表中。
选用这种方式更新时,因为是attach,所以ORM会把整个表中的ID为1的字段全部更新。对于字段比较少的表来说这个还能接受,但是如果我们的表中字段超过50个,那么这个Update操作将会是很理想的。
如果我们需要的只是更新FirstName,那么可以直接只去更新FirstName这个字段吗?是可以的。这就得借助于存储过程。
在Entity Framework中使用存储过程,可能你没试用过。 其实它和Table的使用差不多。
创建一个存储过程来更新FirstName。
在下一步创建ADO.NET Data Model时记得把存储过程给加进来。创建好Model后,(这里使用的是edmx文件自动生成Mapping代码。没使用POCO)。与只是使用表和视图相比,使用存储过程作为Model的DataSource你需要在表的Mapping详细信息下面选择你这个表用到的存储过程,如下图:
这个例子中只有一个存储过程,我们只有选UpdateFirstName。编译以后你们在edmx的设计模式中看到多了一个function():
1 public int UpdateFirstName(Nullable<global::System.Int32> iD, global::System.String firstName) 2 { 3 ObjectParameter iDParameter; 4 if (iD.HasValue) 5 { 6 iDParameter = new ObjectParameter("ID", iD); 7 } 8 else 9 { 10 iDParameter = new ObjectParameter("ID", typeof(global::System.Int32)); 11 } 12 13 ObjectParameter firstNameParameter; 14 if (firstName != null) 15 { 16 firstNameParameter = new ObjectParameter("FirstName", firstName); 17 } 18 else 19 { 20 firstNameParameter = new ObjectParameter("FirstName", typeof(global::System.String)); 21 } 22 23 return base.ExecuteFunction("UpdateFirstName", iDParameter, firstNameParameter); 24 } 25
EF已经自动把为存储过程生成一个function并把它导入到了ObjectContext中。Amazing。。。。。。。。。。
OK,接下来就是我们来使用这个Update方法了。很简单:
1 2 // Execute the Update First Name function 3 int i = EfDb.UpdateFirstName(1, "rename"); 4 5 // you will found the firstname has changed ,who Id is '1' 6 EfDb.SaveChanges();
查询一下结果你会发现ID为1的记录Firstname字段已经改变。
Cheers
Nic