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

c# 使用Entity Framework *** 作Access数据库的示例,第1张

概述EntityFramework是C#开发中最常见的ORM工具。默认EntityFramework只提供支持MSSQL的providerfactory。但是开发者开源贡献了对SQLite、MySql以及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的表,字段如下:

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数据库的示例全部内容,希望文章能够帮你解决c# 使用Entity Framework *** 作Access数据库的示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1253808.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存