欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-18 14:05:16
entity framework是c#开发中最常见的orm工具。默认entity framework只提供支持mssql的provider factory。但是开发者开源贡...

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实例化时引用。

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

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

上一篇:

下一篇: