一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - c# 使用Entity Framework操作Access數據庫的示例

c# 使用Entity Framework操作Access數據庫的示例

2022-02-10 15:27Touchumind C#

本篇文章主要介紹了c# 使用Entity Framework操作Access數據庫的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Entity Framework是C#開發中最常見的ORM工具。默認Entity Framework只提供支持MSSQL的provider factory。但是開發者開源貢獻了對SQLite、MySql以及Access等的支持。

Entity Framework將概念模型中定義的實體和關系映射到數據源,利用實體框架可以將數據源返回的數據具體化為對象;跟蹤對象所做的更改;并發處理;將對象更改傳播到數據源等。今天我們就一起討論如何利用Entity Framework進行查詢、插入、更新和刪除數據。

EF操作使用步驟:1.創建數據庫,建立表。2.先建一個控制臺程序  3.添加ADO.net實體數據模型(AccountEF.edmx),會生成一個edmx和.cs的文件 ,我們點進.cs 的文件可以看到有(上下文,實體)兩部分.具體代碼如下.
edmx文件,用XML編輯器打開時,我們會看到包括: <!-- SSDL content -->存儲模型

c# 使用Entity Framework操作Access數據庫的示例

JetEntityFrameworkProvider

JetEntityFrameworkProvider為Access數據庫文件兼容Entity Framework提供了相應的Provider。在nuget中直接搜索JetEntityFrameworkProvider即可安裝該工具。雖然大多數操作最終是EntityFramework完成因此不需要什么變化,而在數據庫連接等方面還是有些不同和需要注意的地方。

數據庫連接

官方的資源并不多,只提供了一兩個簡單的操作視頻

其中使用的connectionString為在App.config中或Web.config中預定義的以供DbContext實例化時引用。

?
1
2
3
<connectionStrings>
 <add name="DefaultConnection" connectionString="Provider=Microsoft.ACE.OleDb.12.0;Data Source=你的mdb或accdb文件絕對路徑" providerName="JetEntityFrameworkProvider" />
</connectionStrings>

這樣你在實例化自定義的DbContext子類時直接base("name=DefaultConnection")即可建立數據庫連接。

但是我個人不喜歡在配置文件中寫死配置,我更希望使用base(existingConnection, contextOwnsConnection)這種DbContext構造模式,所以需要先直接生成一個DbConnection,這里具體的就是OleDbConnection而不是SqlConnection了。

按照下面的方式直接使用DbProviderFactory創建連接:

?
1
2
3
var dbConnectionString = "Provider=Microsoft.ACE.OleDb.12.0;Data source=Access文件絕對路徑;Persist Security Info=False";
var conn = DbProviderFactories.GetFactory("JetEntityFrameworkProvider").CreateConnection();
conn.ConnectionString = dbConnectionString;

Code First或DB First

默認地,JetEntityFrameworkProvider只支持code first模式。即你先寫好模型,然后根據模型生成數據庫。

但是我的需求是用EF讀取已存在的Access數據庫文件,即DB First模式,這時使用EF讀取Access數據庫文件會報錯提示數據表已存在。

通過code first模式的測試發現:

JetEntityFrameworkProvider會創建一個名為__MigrationHistory的表,字段如下:

  1. MigrationId - text格式 
  2. ContextKey - memo格式 
  3. Model - OleObject格式 
  4. ProductVersion - text格式 

MigrationId值的例子為201612281720088_InitialCreate

ContextKey應該是自定義的DbContext類的namespace加類名的格式

Model是二進制的數據無法查看

ProductVersion包含了Entity Framework的版本號和JetEntityFrameworkProvider的版本號

因此我嘗試在EF連接之前用普通SQL query方式插入記錄:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var dbConnectionString = "Provider=Microsoft.ACE.OleDb.12.0;Data source=Access文件絕對路徑;Persist Security Info=False";
conn = new OleDbConnection(dbConnectionString);
conn.Open();
var exists = conn.GetSchema("Tables", new string[4] { null, null, "__MigrationHistory", "TABLE" }).Rows.Count > 0;
 
if(!exists)
 {
   OleDbCommand cmd = new OleDbCommand("CREATE TABLE __MigrationHistory([MigrationId] TEXT, [ContextKey] MEMO, [Model] OleObject, [ProductVersion] TEXT)", conn);
   cmd.ExecuteNonQuery();
 
   cmd = new OleDbCommand("INSERT INTO __MigrationHistory(MigrationId, ContextKey, ProductVersion) VALUES('" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "', '" + typeof(ATOrionContext).Namespace + ".ATOrionContext', '6.1.3-40302')", conn);
   cmd.ExecuteNonQuery();
 
 }

執行如上操作后確實能夠利用EF連接已存在模型對應數據表的Access數據庫文件了,但是執行查詢操作仍然會報錯buffer is null

經過Debug發現此buffer指的就是插入記錄的Model字段,我們插入時沒有提供值,因為它是一個二進制數據,內容生成方式未知。

嘗試注釋掉插入記錄的操作,只添加__MigrationHistory表,而結果也令人興奮,可以通過模型驗證并且能夠使用EF進行DB First模式的數據開發模式了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.fedepot.com/c-shi-yong-entity-frameworkcao-zuo-accessshu-ju-ku/

延伸 · 閱讀

精彩推薦
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
主站蜘蛛池模板: 我的奶头被客人吸的又肿又红 | 亚洲高清成人 | 欧美丝袜foot job | 日韩在线中文字幕 | 百合互慰吃奶互揉漫画 | 久久机热视频 这里只有精品首页 | 国产91在线精品狼人 | 欧美一级欧美一级高清 | 亚洲成在人线视频 | 日本动漫黄网站在线观看 | 日本护士xxxx爽爽爽 | 欧美日韩一区二区综合在线视频 | 男人插女人软件 | 欧美美女一区二区三区 | 国产一区二区精品久久91 | 国产精品夜色视频一级区 | 日本人和黑人一级纶理片 | 精品视频在线观看 | 国产成人综合视频 | japanese乱子mate| 扒开双腿羞辱调教play视频 | a级免费在线观看 | 99热国产这里只有精品99 | 高h射尿| 成年人网站免费在线观看 | 免费一区二区 | 99re8在这里只有精品2 | 欧美色综合高清免费 | 日本国产高清色www视频在线 | 欧美亚洲影院 | 国产高清自拍视频 | 欧美成人一区二区三区 | 小辣椒精品福利视频导航 | 精品亚洲欧美中文字幕在线看 | 国产色视频一区二区三区 | 日韩高清一区二区三区不卡 | 精品欧美小视频在线观看 | 欧美亚洲国产另类 | 国内精品久久久久影院中国 | 91制片厂 果冻传媒 天美传媒 | 亚洲天堂在线视频播放 |