Oracle-更新数据

更新数据

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<Int32> :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 这样更新字段。用法如下:

/* tips:必须在 lambda 里写 new User() */
context.Update<User>(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
 */