如何影響本地實體
當實體狀態(EntityStatus)爲Unchanged時,與StoreWins相同,從數據源刷新實體。
當實體狀態(EntityStatus)爲Modified時,實體保持不變。
如何影響數據源更新
不使用ClientWins刷新,在調用SaveChanges時,實體按需更新,即實體屬性狀態爲Modified才更新到數據源。
使用ClientWins刷新,調用SaveChanges時分兩種情況:
當實體狀態爲Unchanged時不更新數據源。
當實體狀態爲Modified時,將本地實體更新到數據源,即使實體屬性狀態爲Unchanged也將更新到數據源。
總結:實體未改變時以數據源爲準,否則以本地實體爲準。
測試代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Threading;
using System.Data.SqlClient;
namespace ContextRefreshDemo
{
class Program
{
static void Main(string[] args)
{
using (testEntities context = new testEntities())
{
person one = context.person.First(p => p.id == 1);
one.age = 30;
context.SaveChanges();
Console.WriteLine("/r/n初始值/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
using (SqlCommand cmd = new SqlCommand("update person set age=60 where id=1", new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True;")))
{
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
Console.WriteLine("/r/n通過ADO修改年齡爲60,當前模型值未改變:/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
context.SaveChanges();
Console.WriteLine("/r/n調用SaveChanges後,因爲實體狀態未改變,並不會更新數據庫:/r/n編號:{0} 姓名:{1} 年齡:{2}", one.id, one.name, one.age);
//注意:下面這句會影響Age是否被更新
//one.name = one.name;
context.Refresh(RefreshMode.ClientWins, one);
Console.WriteLine("/r/n調用RefreshMode.ClientWins後:/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
context.SaveChanges();
Console.WriteLine("/r/n調用SaveChanges後,從當前實體更新數據庫:/r/n編號:{0} 姓名:{1} 年齡:{2}", one.id, one.name, one.age);
context.Refresh(RefreshMode.StoreWins, one);
Console.WriteLine("/r/n調用RefreshMode.StoreWins後從數據庫刷新當前對象:/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
one.age = 90;
Console.WriteLine("/r/n修改年齡爲90後:/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
context.Refresh(RefreshMode.StoreWins, one);
Console.WriteLine("/r/n調用RefreshMode.StoreWins後從數據庫刷新當前對象,之前修改丟失:/r/n編號:{0} 姓名:{1} 年齡:{2} 實體狀態:{3}", one.id, one.name, one.age, one.EntityState.ToString());
}
Console.WriteLine("按任意鍵退出");
Thread thread = new Thread(command);
thread.IsBackground = true;
thread.Start();
while (!exit)
{
}
}
static bool exit = false;
static void command()
{
while (true)
{
ConsoleKeyInfo key = Console.ReadKey();
if (key != null) break;
}
exit = true;
}
}
}
測試腳本:
create database test;
go
use test;
go
create table person
(
id int primary key
,name nvarchar(20)
,age int
);
go
insert into person values(1,'king',30);
go
select * from person;