1. 程式人生 > >EF-CodeFirst-2玩的嗨

EF-CodeFirst-2玩的嗨

bsp image name 第一次 第二版 樂觀 date 們的 需要

EF-CodeFirst-2玩的嗨

時間戳、復雜類型、GUID自增長

GUID自增長

GUID用於當主建那是好處多多,但是和int不同。EF不會自動識別第一個為類名+Id開頭或int類型字段 去設置自增長。尷尬的GUID怎麽玩呢。。

Data Annation玩法

技術分享

Fluent API 玩法

技術分享

註:上面的設置好像沒什麽用,至少我是沒跑起來。。。故而使用的是構造函數玩法。。。

時間戳

好處多多的東西啊,對於一些並發的業務來說建表的時候是一定要有這個的。但是某些原因….. 這就尷尬了 。。

最重要的一點是樂觀鎖,什麽是樂觀鎖呢?

在並發的時候,A、B兩個線程同時拿到一條記錄然後進行更新再插入數據庫。這樣會導致A、B都成功了!對於一些搶單的來說這樣是不可以的。樂觀鎖則是在第一次更新的時候把時間戳也更新一下。另一個線程更新的時候會判斷當前的與表裏的時間戳不一致的話。那就失敗了。

技術分享

Fluent API 玩法

技術分享

下面開始模擬並發,aContext先拿到更改一下字段值,緊接著bContext也拿到了更新了一字段值並保存。這時aContext再去保存

技術分享

後面執行,bContext的成功保存!而aContext則報錯

技術分享

技術分享

假如像我這種尷尬的情況,表已經這樣了。應該怎麽做樂觀鎖呢?可以使用 ConcurrencyCheck對某個唯一的字段進行註解,也可以達到控制並發的效果

復雜類型

隨著業務的擴展,表中的字段自然是越來越多,實體越來越膨脹。想想這會帶來什麽後果?惡心的類,大多無用的返回值,結構不清晰。這些都是需我們去註意的。

這裏假如項目第一版我們的用戶只有Name字段,但是在第二版需要加上地址。那簡單,直接在User類中直接加地址,但是上面說這樣是不好的。我們應該去 "擴展"。那也簡單,新建一個實體就是咯,然後在User中加入 屬性。但是!這樣會自動映射外建關系。這時我們就需要復雜類型了

  復雜類型沒有ID //這裏有些錯誤 [Table(xxx)] 是沒用的。因為不是創建新的表

技術分享

在User類中進行擴展

技術分享

搞定後,再Update-DataBase 一下

技術分享

額。。。這就尷尬了。怎麽還是在一個表中?之前是我理解錯了。我們代碼中的實體膨脹問題是解決了但是表中還是並沒有。這裏我個人還是建議單弄一個表,把不屬於表的"核心屬性"放到擴展表中,這樣也算不錯吧。好歹代碼中不是這麽惡心了

EF-CodeFirst-2玩的嗨