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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# Entity Framework中的IQueryable和IQueryProvider详解

    前言 相信大家对Entity Framework一定不陌生,我相信其中Linq To Sql是其最大的亮点之一,但是我们一直使用到现在却不曾明白内部是如何实现的,今天我们就简单的介绍IQueryable和IQueryProvider. IQueryable接口 我们先聊聊这个接口,因为我们在使用EF中经常看到linq to sql语句的返回类型是IQueryable,我们可以看下这个接口的结构: 复制代码 代码如下: public interface IQueryable : IEnumerab

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

    Entity Framework是C#开发中最常见的ORM工具.默认Entity Framework只提供支持MSSQL的provider factory.但是开发者开源贡献了对SQLite.MySql以及Access等的支持. Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何利用Entity Framework进行查询.插入.更新和删除数据.

  • Entity Framework Core生成数据库表

    目录 一.引言 二.具体示例 1.代码生成 2.程序包管理器控制台迁移 1.安装Microsoft.EntityFrameworkCore.Tools包 2.添加迁移命令 3.更新数据库 3.命令行迁移 1.添加迁移 2.更新数据库 三.总结 一.引言 生成数据库表有下面的三种方式: 代码生成. 程序包管理器控制台迁移. 命令行迁移. 下面分别介绍上面的三种方法. 二.具体示例 1.代码生成 在程序里面执行下面的代码可以在运行时生成数据库: dbContext.Database.EnsureCr

  • go语言通过odbc操作Access数据库的方法

    本文实例讲述了go语言通过odbc操作Access数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,下载地址为:https://github.com/weigj/go-odbc 复制代码 代码如下: package main; import (  "fmt"  "database/sql"  _"odbc/driver" ) func main(){  conn,err := sql.Open("odbc&q

  • Asp 操作Access数据库时出现死锁.ldb的解决方法

    于是我登陆主机的管理面板,重启了网站服务,ldb文件就消失了,网站打开也正常了,但过了数小时后,网站又再次出现以上情况,此种情况持续了好一段时间,网站后来被虚拟主机的供应商屏蔽了,反馈给我的说法是因为我的网站运行时大量占用CPU资源,所以予暂时屏蔽,让我对网站程序或数据库进行优化. 在百度上搜索了一下这方面的情况,结果也不少,总结下来主要都是因为对数据库存取完后,没有及时释放记录集和断开数据库连接,以下谈谈操作Access数据库的标准方法: 1.数据库连接方法:Conn.asp <% dim c

  • php操作access数据库的方法详解

    本文实例讲述了php操作access数据库的方法.分享给大家供大家参考,具体如下: 在PHP网站开发中,PHP与Mysql是最好的组合,但是当你想将其他平台的网站移植到PHP平台时,必然遇到移植性的问题,如ASP+ACCESS平台如何移植?首当其冲便是PHP连接Access数据库问题,在不改变数据库的情况下,PHP如何与Access数据库建立连接? PHP提供多种连接数据库解决方案,在此详解如何使用PHP ADOdb.PDO.ODBC与Access数据库建立连接的代码实例,作为抛砖引玉. 准备工

  • Python操作Access数据库基本步骤分析

    本文实例分析了Python操作Access数据库基本步骤.分享给大家供大家参考,具体如下: Python编程语言的出现,带给开发人员非常大的好处.我们可以利用这样一款功能强大的面向对象开源语言来轻松的实现许多特定功能需求.比如Python操作Access数据库的功能实现等等.在Python操作Access数据库之前,首先,你应安装了Python和Python for Windows extensions. 步骤之1.建立数据库连接 import win32com.client conn = wi

  • C# 操作 access 数据库的实例代码

    随笔: (1)   命名空间    using System.Data.OleDb; (2)   连接字符串 private staticstring connStr = @"Provider= Microsoft.Ace.OLEDB.12.0;Data Source = d:\login.accdb"; 注意: a.DataSource = 数据库存放的路径(这里数据库放到了D盘目录下)              b. 2003版本的Access数据库链接字符串: privatest

  • Python操作MySQL数据库的示例代码

    1. MySQL Connector 1.1 创建连接 import mysql.connector config={ "host":"localhost","port":"3306", "user":"root","password":"password", "database":"demo" } con=

  • Python 操作SQLite数据库的示例

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.在很多嵌入式产品中使用了它,它占用资源非常的低,python 中默认继承了操作此款数据库的引擎 sqlite3 说是引擎不如说就是数据库的封装版,开发自用小程序的使用使用它真的大赞 简单操作SQLite数据库:创建 sqlite数据库是一个轻量级的数据库服务器,该模块默认集成在python中,开发小应用很不错. import sqlite3 # 数据表的创建 conn = sqlite3.conn

  • VB使用ADO操作Access数据库

    这里只是个简单不能再简单的VB小程序实例,但它包含这几个关键字:VB6.0.ADO.Access 环境:visual basic 6.0 企业版(非精简版,不然会缺少必须的控件) 数据库:Access数据库,数据库是xs.mbd,内建表为xj 结果:vb使用ADO连接access数据库,查询xj表中的所有数据,然后把查询到的结果循环输出到窗口中. 代码: Private Sub Form_Click() Dim db As New ADODB.Connection, RS As New ADOD

随机推荐