c# 使用Entity Framework操作Access数据库的示例

 更新时间:2017年11月16日 10:07:43   作者:Touchumind  
本篇文章主要介绍了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 -->存储模型

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

  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方式插入记录:

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#在Windows上调用7-zip实现压缩文件

    C#在Windows上调用7-zip实现压缩文件

    这篇文章主要为大家详细介绍了C#如何在Windows上调用7-zip实现压缩文件,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以学习一下
    2023-10-10
  • C#实现读取txt文件生成Word文档

    C#实现读取txt文件生成Word文档

    大家好,本篇文章主要讲的是C#实现读取txt文件生成Word文档,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 浅谈Visual C#进行图像处理(读取、保存以及对像素的访问)

    浅谈Visual C#进行图像处理(读取、保存以及对像素的访问)

    本文主要介绍利用C#对图像进行读取、保存以及对像素的访问等操作,介绍的比较简单,希望对初学者有所帮助。
    2016-04-04
  • C#实现剪切板功能

    C#实现剪切板功能

    这篇文章主要为大家详细介绍了C#实现剪切板功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C# Lambda表达式及Lambda表达式树的创建过程

    C# Lambda表达式及Lambda表达式树的创建过程

    这篇文章主要介绍了C# Lambda表达式及Lambda表达式树的创建过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • c#通过unicode编码判断字符是否为中文示例分享

    c#通过unicode编码判断字符是否为中文示例分享

    本文介绍了c#通过unicode编码判断字符是否为中文的示例,在unicode字符串中,中文的范围是在4E00..9FFF:CJK Unified Ideographs。通过对字符的unicode编码进行判断来确定字符是否为中文
    2014-01-01
  • 那些年,我还在学习C# 学习笔记续

    那些年,我还在学习C# 学习笔记续

    那些年学习C#,就是对C#相关的一些知识有一个了解,等到要用时才不会找不到方向,比如说扩展方法,开始时怎么觉得没有用,后来了解到asp.net MVC,它可以用来扩展Html类,比如做一个分页的方法;所以对一门语言了解宽一些是没有坏处的
    2012-03-03
  • 简单谈谈C#中深拷贝、浅拷贝

    简单谈谈C#中深拷贝、浅拷贝

    深拷贝和浅拷贝都是对对象进行的拷贝复制。而他们的不同就在于:一个对象中可能会有值类型的字段,也可能会有引用类型的字段。浅拷贝直接拷贝值、引用类型的指针。而深拷贝则是重新构造字段指针所指向的对象,并没有拷贝该字段的指针,或是与该字段指针指向同一块内存
    2015-06-06
  • 基于WPF实现控件轮廓跑马灯动画效果

    基于WPF实现控件轮廓跑马灯动画效果

    这篇文章主要介绍了如何利用WPF实现控件轮廓跑马灯动画效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-08-08
  • C# Distinct和重写IEqualityComparer时要知道的二三事

    C# Distinct和重写IEqualityComparer时要知道的二三事

    这篇文章主要给大家介绍了关于C# Distinct和重写IEqualityComparer时要知道的二三事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06

最新评论