DOC

Batch Updating in Entity Framework

By Eugene Watkins,2014-10-05 12:50
14 views 0
Batch Updating in Entity Framework

Batch Updating in Entity

    Framework

/黃忠成

The Update Story of Entity Framework

     多數的O/R Mapping Framework都有個共同的行為模式;在刪除資料或是修改資料前;必須隱式的下達一個Query;由資料庫取得即將要更新的資料列; 然後轉成物件後再更新。

     這個行為模式;多半也會成為設計師考慮是否使用O/R Mapping Framework考量之一;因為多一個Query;就代表著效能會因此降低;雖然對於 O/R Mapping Framework而言;這是一個必要的行為模式;因為它們得考量到當物件有著關聯時的情況。但對於實際的專案來說;跳過這個Query來更新資料; 卻也是必然會出現的情況;既然是必然會出現的情況;多數的O/R Mapping Framework也只好為此做出讓步;提供可跳過Query來更新資料的機制; Entity Framework自然也擁有這個機制。

Update Row without Query

     Entity Framework支援跳過Query步驟來更新資料列;寫法如下: static void UpdateWithoutQuery()

    {

     NorthwindEntities context = new NorthwindEntities();

     Customers c = new Customers();

     c.CustomerID = "VINET";

     context.AttachTo("Customers", c);

     c.CompanyName = "15556";

     context.SaveChanges();

    }

    注意;AttachTo的位置很重要;在這之前所設定的值;都不會被寫入;例如下列的Region便不會被寫入。

static void UpdateWithoutQuery()

{

     NorthwindEntities context = new NorthwindEntities();

     Customers c = new Customers();

     c.CustomerID = "VINET";

     c.Region = "TWN";

     context.AttachTo("Customers", c);

     c.CompanyName = "15556";

     context.SaveChanges();

    }

Delete Row without Query

     同樣的手法;也可以用在刪除資料列上。

static void DeleteWithoutQuery()

    {

     NorthwindEntities context = new NorthwindEntities();

     Customers c = new Customers();

     c.CustomerID = "CT002";

     context.AttachTo("Customers", c);

     context.DeleteObject(c);

     context.SaveChanges();

    }

缺點?

     那麼這樣就夠了嗎?事實上;O/R Mapping Framework一直都缺少著一種機制;那就是Batch Update;在很多情況下;我們希望能

    下達下列的指令來更新一筆以上的資料列。

    UPDATE Customers SET SomeFlag = 1 WHERE Region = “TW”

     O/R Mapping Framework中;這得以迴圈方式;一一查詢出每一筆Region=”TW”的資料;然後更新SomeFlag;由於沒有指定主鍵; 所以也無法使用先前提及的方法來跳過Query動作;我們得遵守O/R Mapping

    Framework的規則;一筆筆Query後更新;這是很沒效率的動作。

     當然;所有O/R Mapping Framework都支援讓設計師直接下達SQL的方法;Entity Framework而言;可以這麼下:

context.ExecuteStoreCommand(“UPDATE Customers SET SomeFlag = 1

    WHERE Region = „TW‟);

     不過;這種方法會失去Entity Framework可切換資料庫的特色;所以得特別小心把這部份獨立出來;為日後切換資料庫時留條後路。

Batch Update