Entity Framework 小知識分享

来源:http://www.cnblogs.com/woquwoqu/archive/2017/01/23/6344156.html
-Advertisement-
Play Games

參考頁面: http://www.yuanjiaocheng.net/entity/Persistence-in-EF.html http://www.yuanjiaocheng.net/entity/crud-in-connected.html http://www.yuanjiaocheng.n ...


參考頁面:

http://www.yuanjiaocheng.net/entity/Persistence-in-EF.html

http://www.yuanjiaocheng.net/entity/crud-in-connected.html

http://www.yuanjiaocheng.net/entity/crud-in-Disconnected.html

http://www.yuanjiaocheng.net/entity/add-entity-in-disconnected.html

http://www.yuanjiaocheng.net/entity/update-entity.html

與Entity Framework相伴的日子痛並快樂著。今天和大家分享一下一個快樂,兩個痛苦。

先說快樂的吧。Entity Framework在將數據插入資料庫時,如果主鍵欄位是自增標識列,會將該自增值返回給實體對象對應的屬性。

比如下麵添加博客隨筆至資料庫的示例代碼:

var blogPost = new BlogPost()
{
Author
= " 博客園 " ,
Title
= "程式員的網上家園 "
};
using (BlogDbContext context = new BlogDbContext())
{
context.BlogPosts.Add(blogPost);
context.SaveChanges();
return blogPost.ID;
}

SaveChanges()之後,blogPost.ID的值就是資料庫中對應自增標識列的值。

看一下Entity Framework生成的SQL語句:

exec sp_executesql N ' insert [dbo].[blog_Content]([Title],[Author])
values (@0, @1)
select [ID]
from [dbo].[blog_Content]
where @@ROWCOUNT > 0 and [ID] = scope_identity()
' ,
N
' @0 nvarchar(128),@1 nvarchar(128), ' , @0 = N ' 程式員的網上家園 ' , @1 = N ' 博客園 '

EF通過scope_identity()獲取自增列的值,而且我們沒有對BlogPost的ID屬性進行任何設置,是EF智能地判斷出ID就是自增標識列。

在以前沒有使用Entity Framework的時代,用的是存儲過程,存儲過程有一堆參數,實體對象的屬性值要一一對應地賦值給這些參數,執行存儲過程之後,還要通過ParameterDirection.Output的參數獲取自增ID的值。

現在,只要把東西交給Entity Framework,並和她說,把它放到資料庫中去。多省心!多快樂!

但是,自以為是的Entity Framework用這個特性給人快樂的同時,也給人帶來了一點痛苦。她認為只要實體類中有ID屬性,資料庫對應的是一定是自增標識列,真是夠自以為是的。當我們把博客隨筆添加至資料庫後,準備用這個自增ID將隨筆內容添加至資料庫(隨筆內容存儲在單獨的資料庫,通過ID欄位與隨筆進行關聯,不是自增的),卻出現錯誤提示:

Cannot insert the value NULL into column 'ID',  table 'CNBlogsText.dbo.blog_PostBody'; column does not allow nulls.

看看EF生成的SQL語句:

exec sp_executesql N ' insert [dbo].[CNBlogsText_blog_PostBody]([Text])
values (@0)
select [ID]
from [dbo].[CNBlogsText_blog_PostBody]
where @@ROWCOUNT > 0 and [ID] = scope_identity()
' ,N ' @0 nvarchar(128) ' , @0 = N ' 幫助程式員用技術改變世界 '

不是自增列,也來個scope_identity()。這麼聰明的Entity Framework,也會幹這樣的傻事。

還好,EF定製靈活的特性可以讓我們輕鬆化解這個痛苦,只要在BlogDbContext中添加下麵的代碼:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity
< PostBody > ().Property(p => p.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

也可以通過在實體類屬性上加標記實現:

 

public class BlogPost
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get ; set ; }
}

第二個痛苦是眾所周知的Entity Framework不支持枚舉類型,雖然大家都知道,但還是想拿出曬曬,解解恨。

 

EF怎麼對待枚舉類型的呢?對於實體類中實實在在存在的枚舉類型的屬性,EF對它們視而不見,就當它不存在。

對於這個痛苦,目前無法化解(要等EF的下一版本),只能藉助旁邊左道減輕痛苦,請看“旁邊左道”之“移花接木”。

實體類中的代碼:

public class BlogPost
{
public BlogPostType PostType
{
get { return (BlogPostType)PostTypeEf; }
set { PostTypeEf = ( int )value; }
}
public int PostTypeEf { get ; set ; }
}

EF不認枚舉類型,但認int類型,所以增加個PostTypeEf,僅供EF專用,等EF的下一版本支持枚舉類型時再去掉。

BlogDbContext也要配合著進行修改:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity
< BlogPost > ().Ignore(p => p.PostConfig);
modelBuilder.Entity
< BlogPost > ().Property(p => p.PostTypeEf)
.HasColumnName(
" PostType " );
}

分享完畢,快樂更加快樂,痛苦不再痛苦。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從功能上來說,請參考 預告篇,因自知當時預告篇沒有任何含金量,所以並沒有主動推送到首頁,而是私下的給一些人發的。 從個人角度上來說,我希望.net的環境會越來越好,就我自己的成長曲線是從mxdn開始自學、cxdn嘗試解答問題、博客園讀別人博客再到自己寫博客、最後到工作中經常使用到的stackxxxx ...
  • 1.匿名類型:匿名類型是C#3.0新增的特性,是強類型(由編譯器後臺在生成為CIL時,自動聲明的代碼定義類型),聲明與初始化屬性後其屬性是盡讀屬性。只有在屬性的名稱、順序、類型一致時,多個聲明匿名變數才會共用同一個匿名類型。其ToString()方法已重寫了返回的是屬性名稱與值的文本。 2.隱式局部 ...
  • 1.多播委托:由與delegate關鍵字聲明的委托,在編譯後預設繼承Delegate與MulticastDelegate類型,所以聲明的委托自然就含有多播委托的特性,即一個委托變數可以調用一個方法鏈(多個相同簽名的方法)。在C#中,多播委托的實現是一個通用的模式,目的是避免大量的手工編碼,這個模式稱 ...
  • Unity下GL沒有畫圓的函數,只能自己來了。 如果能幫到大家,我也很高興。 雖然沒有畫圓的函數,但是能畫直線,利用這一點,配合微積分什麼的,就可以畫出來了。反正就是花很多連在一起的直線,每條直線足夠短的時候,就足夠圓了 參數分別為: x,y,z 中心點三維坐標, r 圓的半徑, accuracy ...
  • 魔方 是一個基於 ASP.NET MVC 的 用戶許可權管理平臺,可作為各種信息管理系統的基礎框架。 演示:http://cube.newlifex.com 源碼 演示賬號:admin/admin 源碼: https://git.newlifex.com/NewLife/X/Tree/master/N ...
  • 先上圖: 操作方法: 1、先設置一下gridview中屬性:IndicatorWidth,一般為:40。如下圖;(一般可以顯示5位數字。如要更長顯示,自己測試一下。) 2、找到gridview中的:CustomDrawRowIndicator事件,輸入如下麵代碼: 1 private void gv ...
  • 參考頁面: http://www.yuanjiaocheng.net/CSharp/csharp-class.html http://www.yuanjiaocheng.net/CSharp/csharp-variable.html http://www.yuanjiaocheng.net/CSha ...
  • 參考頁面: http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-api-controller.html http://www.yuanjiaocheng.net/we ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...