Access 2007 - 2010 可以使用啥 ORM?我在 WPF 绑定到表等之后
Posted
技术标签:
【中文标题】Access 2007 - 2010 可以使用啥 ORM?我在 WPF 绑定到表等之后【英文标题】:What ORM can I use for Access 2007 - 2010? I'm after WPF binding to the tables etcAccess 2007 - 2010 可以使用什么 ORM?我在 WPF 绑定到表等之后 【发布时间】:2013-01-03 12:23:04 【问题描述】:我有一个所有网站都有的旧数据库,它以多种类别/子类别/子项目格式描述特定内容。到目前为止,添加/编辑内容要么是在表格中手动工作,要么是原始 sql Windows 窗体工具(我在开始工作时构建的!)。
我想要具有 WPF 4.5 和 .net 4.5 的实体框架样式拖放、绑定和运行编码能力。
我对使用 NHibernate 犹豫不决,因为 EF5 使用起来非常简单,我知道 Nhibernate 需要更多工作(尽管 ORM 更快)。有没有效果很好的替代品?如果可能的话,我试图避免过多的手动设置。编辑器不是一个强制性项目,我不能证明在它上面做很多额外的工作是合理的 - 但如果把它的一个好的版本放在一起,它会让我在接下来的 2 年的工作更轻松。
我非常了解所有反对 Access 的论点 :) - 至少在一年内都不能选择交换它。
搜索了 *** 网站后,我没有看到太多关于此的问题,但如果我错过了一个好的问题,我深表歉意!
更新:我认为我应该稍微改进我的问题,因为我确实需要在什么代码生成时得到什么,这样我就不需要为 Access 数据库手动构建所有类。从我所见,Dapper 的工作是围绕效率,但与生成代码不同。来自实体框架的思维方式,我可以看到我在思考中将任务结合在一起的地方:)。所以除了煮我自己 - 有没有人知道一个很好的代码生成与Access一起使用。我可以嫁给 Dapper :)。
【问题讨论】:
【参考方案1】:您不能使用 Entity Framework,因为它不适用于 Access 数据库。
可以将 NHibernate 与 MS Access 一起使用,尽管 NH 不支持开箱即用的 Access。 您需要来自 NHContrib 的 NHibernate.JetDriver 和 here 是 NH 配置文件的示例设置。
如果我没记错的话,NH Contrib 需要根据您使用的确切 NH 版本进行编译,因此您可能需要下载源代码并自行编译。
作为替代方案,您可以使用众多微 ORM 之一,例如 Stack Overflow 自己的 Dapper。
Dapper 与数据库无关,因此它可以连接到包括 Access 在内的所有内容。引用自官网:
dapper 会与我的数据库提供商一起工作吗? Dapper 没有特定于数据库的实现细节,它适用于所有 .net ado 提供程序 包括 sqlite、sqlce、firebird、oracle、mysql 和 SQL Server
缺点是因为 Dapper 与 DB 无关,所以您必须自己实现一些先进的东西,例如 paging。
编辑:
IMO Dapper 属于“相当容易快速运行的类别”。 看看这个:(complete demo project here)
using System;
using System.Data.OleDb;
using Dapper;
namespace DapperExample
class Program
static void Main(string[] args)
using (var con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"))
var list = con.Query<Product>("select * from products");
Console.WriteLine("map to a strongly typed list:");
foreach (var item in list)
Console.WriteLine(item.ProductNumber + " : " + item.Description);
Console.WriteLine();
var list2 = con.Query("select * from products");
Console.WriteLine("map to a list of dynamic objects:");
foreach (var item in list2)
Console.WriteLine(item.ProductNumber + " : " + item.Description);
Console.ReadLine();
public class Product
public string ProductNumber get; set;
public string Description get; set;
此示例代码中有两个不同的查询。
第一个映射到强类型列表,例如结果是IEnumerable<Product>
。当然它需要一个可以映射到的Product
类。
第二个查询返回一个IEnumerable<Dynamic>
(>= .NET 4.0),这意味着属性是动态评估的,您不需要之前定义类,但缺点是您失去了类型安全性 (和智能感知)。
我个人的看法是,缺少类型安全性对我来说是一个交易破坏者(我更喜欢第一个查询语法),但也许这适合你。
【讨论】:
那么我猜在相当容易快速运行的类别中没有什么?真可惜。这项工作还不够大/重要到无法真正深入研究 NHibernate,否则我会花一些时间来研究它。 Dapper 可能会与我自己拼凑的生成器集成。感谢您的帮助和链接。很遗憾,MS Access 几乎被大多数供应商排除在 ORM 派对之外——它可能不是一个合适的数据库,但它已经很受欢迎了! 虽然我没有给它足够的时间,但我看不出使用 Dapper 做我正在做的事情有什么好处 - 看起来我仍然手动创建所有自己的类来结婚到数据库?当我已经习惯了实体框架的代码生成方面时,我是否错过了重点(如果是,则接受)。我现在正在尝试解决这个问题,但看起来确实如此。 使用 Dapper,您可以手动创建类,就像使用 NHibernate 时一样。在这两种情况下,该工具只是将查询结果映射到类。诚然,这两种工具都无法像 EF 那样生成类。 我认为这将是一个疯狂的时刻项目——为 EF 构建一个访问提供程序。当然,纯粹的利他主义是为了减轻其他必须为此写作的可怜的开发者:)。可能需要我一段时间...谢谢克里斯蒂安。我现在去打扰别人!非常感谢。 我刚刚注意到,如果您滚动到official Dapper page 的底部,则会出现一个第三方工具列表。其中之一looks like a code generator。也许你可以试一试。【参考方案2】:讨厌复活一个旧线程,但我最近使用 PetaPoco(一种微型 ORM 和 MS Access)做了一个 WPF 项目,所以我想我会分享我的实现。
要为 PetaPoco 添加 MS Access 支持,您只需添加几段代码:
首先添加一个 AccessDatabaseType 类。所有 DataBaseType 类都位于 PetaPoco.cs 文件的末尾。只需在 SqlServerDatabaseType 之后添加新类即可。
class AccessDatabaseType : DatabaseType
public override object ExecuteInsert(Database db, IDbCommand cmd, string PrimaryKeyName)
db.ExecuteNonQueryHelper(cmd);
return db.ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;");
接下来,修改 PetaPoco.Internal.DatabaseType.Resolve() 以支持 AccessDatabaseType。 (此代码假定您使用的是 Jet OLEDB 提供程序)
public static DatabaseType Resolve(string TypeName, string ProviderName)
//...
if (ProviderName.IndexOf("Oledb", StringComparison.InvariantCultureIgnoreCase) >= 0)
return Singleton<AccessDatabaseType>.Instance;
// Assume SQL Server
return Singleton<SqlServerDatabaseType>.Instance;
最后,实例化 PetaPoco 使用这个:
Db = New PetaPoco.Database("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb", "System.Data.Oledb")
限制:
PetaPoco 假设您的主键是自动编号/身份字段。如果您的 PK 不是自动编号或复合 PK,则需要实现自己的插入和保存逻辑。 我的应用程序不需要分页,所以我没有实现它。【讨论】:
我注意到官方 PetaPoco 存储库已更新为支持 MS Access。 (github.com/CollaboratingPlatypus/PetaPoco) Hrrmm,我想我的帖子启发了这个新功能。 :) @@@IDENTITY ?或@@IDENTITY ?【参考方案3】:我们正在使用 Jet Entity Framework Provider。这样我们以后可以轻松地移植到另一个数据库。
它没有上面提到的所有限制,而且效果很好。
【讨论】:
【参考方案4】:Tortuga Chain 完全支持 Access。
https://docevaad.github.io/Chain/Introduction.htm
【讨论】:
以上是关于Access 2007 - 2010 可以使用啥 ORM?我在 WPF 绑定到表等之后的主要内容,如果未能解决你的问题,请参考以下文章
我可以在Access 2007 - 2010中使用哪些ORM?我是在WPF绑定到表等之后
在 Access 2010 中查看时,Access 2007 表单中的幻影框
使用 ms access 2007 和 ado 部署 delphi 2010 以进行数据库连接所需的文件
在 Linux 上将 PHP 与 MS Access 2007-2010 连接