更新数据
Chloe 支持两种数据更新方式。
1.实体更新:
User user = new User();
user.Id = 1;
user.Name = "lu";
user.Age = 28;
user.Gender = Gender.Man;
user.OpTime = DateTime.Now;
/* 更新所有映射的字段 */
context.Update(user);
/*
* String :P_0 = 'lu';
Int32 :P_1 = 1;
Int32 :P_2 = 28;
Nullable :P_3 = NULL;
DateTime :P_4 = '2016/9/5 9:20:07';
UPDATE "USERS" SET "NAME"=:P_0,"GENDER"=:P_1,"AGE"=:P_2,"CITYID"=:P_3,"OPTIME"=:P_4
WHERE "USERS"."ID" = :P_1
*/
由于 user 对象未被上下文跟踪,这会使所有的映射列都会被更新。Chloe 也支持类似 EF 一样只更新被修改过的属性。
/*
* 支持只更新属性值已变的属性
*/
/* 在修改实体属性前让上下文跟踪实体 */
context.TrackEntity(user);
/* 然后再修改实体属性 */
user.Name = user.Name + "1";
/* 然后调用 Update 方法,这时只会更新被修改过的属性 */
context.Update(user);
/*
* String :P_0 = 'lu1';
Int32 :P_1 = 1;
UPDATE "USERS" SET "NAME"=:P_0 WHERE "USERS"."ID" = :P_1
*/
2.lambda 方式更新:
该方式解决的问题是:1.指定列更新;2.批量更新;3.支持类似 Age=Age + 100 这样更新字段。用法如下:
/* tip:必须在 lambda 里写 new User() */
context.Update(a => a.Age > 18, a => new User()
{
Name = a.Name,
Age = a.Age + 100,
Gender = Gender.Man,
OpTime = DateTime.Now
});
/*
* UPDATE "USERS" SET "NAME"="USERS"."NAME","AGE"=("USERS"."AGE" + 100),"GENDER"=1,"OPTIME"=SYSTIMESTAMP
WHERE "USERS"."AGE" > 18
*/