原文地址:http://www.tuicool.com/articles/IBvya2

Entity Framework是C#开发中最常见的ORM工具。默认Entity Framework只提供支持MSSQL的provider factory 。但是开发者开源贡献了对SQLite、MySql以及Access等的支持。

JetEntityFrameworkProvider

JetEntityFrameworkProvider为Access数据库文件兼容Entity Framework提供了相应的 Provider 。在nuget中直接搜索JetEntityFrameworkProvider即可安装该工具。虽然大多数操作最终是EntityFramework完成因此不需要什么变化,而在数据库连接等方面还是有些不同和需要注意的地方。

数据库连接

官方的资源并不多,只提供了一两个简单的 操作视频

其中使用的 connectionString 为在App.config中或Web.config中预定义的以供DbContext实例化时引用。

<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 创建连接:

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 的表,字段如下:

MigrationId - text格式
ContextKey - memo格式
Model - OleObject格式
ProductVersion - text格式

MigrationId值的例子为 201612281720088_InitialCreate

ContextKey应该是自定义的DbContext类的namespace加类名的格式

Model是二进制的数据无法查看

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

因此我尝试在EF连接之前用普通SQL query方式插入记录:

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模式的数据开发模式了。

c# 使用Entity Framework操作Access数据库相关推荐

  1. oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  2. 使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  3. 使用Entity Framework Core访问数据库(DB2篇)

    上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...

  4. C# 操作ACCESS数据库

    看到CSDN上不断兄弟姐妹提问关于c#操作Access的问题,于是本人利用闲暇将c#操作Access的方法加以总结,主要解决的问题有: 创建mdb 创建table 读取table内容 查询table中 ...

  5. python不可以操作access数据库_Python操作Access数据库基本操作步骤分析

    Python编程语言的出现,带给开发人员非常大的好处.我们可以利用这样一款功能强大的面向对象开源语言来轻松的实现许多特定功能需求.比如Python操作Access数据库的功能实现等等.在Python操 ...

  6. C#操作Access数据库

    本教程介绍了如何通过ADO.NET的OleDb相关类来操作Access数据库的相关步骤. 1     软件环境 开发平台:Microsoft Visual Studio 2010 数据库:Micros ...

  7. 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库

    呵呵,说实在的,这个类俺是从外国论坛上下载的,自己研究了下如何使用并做了一个DEMO,演示如何操作ACCESS数据库.希望给那些没有接触数据库编程的初学者一点启发吧.有任何问题请及时与我联系^_^.程 ...

  8. MFC+ODBC操作Access数据库pdf版

    <MFC+ODBC操作Access数据库pdf版> 下载地址: 网盘下载 转载于:https://www.cnblogs.com/long12365/p/9731370.html

  9. golang odbc mysql_go语言通过odbc操作Access数据库的方法

    本文实例讲述了go语言通过odbc操作Access数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,下载地址为:https://github.com/weigj/go-od ...

  10. 直接通过ADO操作Access数据库(修改版)

    自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序.关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了.让我们直接步入主题:如何掌握 ...

最新文章

  1. bootstrap 弹框使用
  2. dhcp 中继代理配置方法
  3. jvm 什么是对象头,里面有什么
  4. 余额宝 vs. P2P网贷,谁更有生命力?
  5. 反编译C#的dll文件并修改,再重新生成dll
  6. SqlZoo.net习题答案:Using the SELECT statement.【nobel】
  7. 敏捷软件开发VS传统软件开发
  8. 孔浩HTML,CSS笔记,心得(第二天)
  9. Win10 没有激活,如何改变任务栏位置
  10. access/sql server笔记(20160818)
  11. 支付宝领红包的算法猜想
  12. 解决联想笔记本E40 安装VM虚拟机后每次启动都会导致电脑蓝屏问题
  13. 小学生学计算机flash,利用Flash软件进行小学电脑绘画教学
  14. Godaddy子域名转向外部IP地址设置
  15. 华为称拥有超万项美国专利,知产政治化会摧毁创新
  16. 如何注册免费的服务器和域名?如何将自己的项目部署到免费的服务器上并生成线上地址?
  17. java jdom_java使用Jdom实现xml文件写入操作实例
  18. webpackjsonp 还原_钌金属单原子电催化实现常温常压高效还原固氮
  19. 0.5mm的焊锡丝能吃多大电流_你知道该怎样计算多大的功率该用多大的电线电缆?...
  20. 2021-04-25电气防火限流式保护器在古村建筑消防安全中的应用-安科瑞耿敏花

热门文章

  1. matlab 秩和检验,多个独立样本比较的秩和检验(Kruskal-Wallis H)
  2. 试用bus hound来分析STM32CubeMX来生成USB_HID_Mouse工程
  3. 海康威视NVR硬盘录像机DS-7808N安装调试教程,监控系统安装教程
  4. MT6573_android_LCD_backlight_Driver
  5. VI设计手册制作全流程
  6. 实验二 Linux下Vi编辑器的使用
  7. GNSS/INS组合导航(九):三维简化的INS/GPS组合导航系统
  8. XCode 动态库未签名问题的解决
  9. spring boot中如何实现在手机注册和登录时获取验证码(阿里短信服务)
  10. 在Edge浏览器中设置编码方式