理解實體模型的刷新模式RefreshMode.ClientWins

如何影響本地實體


當實體狀態(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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章