我可以在Access 2007 - 2010中使用哪些ORM?我是在WPF绑定到表等之后
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在Access 2007 - 2010中使用哪些ORM?我是在WPF绑定到表等之后相关的知识,希望对你有一定的参考价值。
我有一个所有网站都有的遗留数据库,它描述了许多catagory / subcatagory /子项目格式的特定内容。到目前为止,添加/编辑内容是表格中的手动工作或原始sql Windows Forms工具(我在工作中开始构建!)。
我希望实体框架样式拖放,绑定和运行WPF 4.5和.net 4.5的编码能力。
我对使用NHibernate犹豫不决,因为EF5非常简单,我理解Nhibernate更多的工作(虽然更快的ORM)。有替代方案效果很好吗?如果可能的话,我试图避免过多的手动设置。编辑器不是一个强制性的项目,我不能证明它有很多额外的工作 - 但是如果将它的一个很好的版本放在一起,这将使我的工作在接下来的两年更容易。
反对Access的所有论据我都非常清楚:) - 交换这个至少一年不是一个选择。
在搜索了StackOverflow网站后,我没有看到太多问题,但是如果我错过了一个好的问题,我会道歉!
感谢您提出的任何建议!
更新:我认为我应该稍微改进我的问题,因为我需要在代码生成中获得什么,这样我就不需要为Access数据库构建所有类了。从我所看到的,Dapper的工作是围绕效率,但不同于生成代码。来自实体框架的思维模式,我可以看到我在思考中将任务联合起来:)。所以除了煮我自己 - 有没有人知道一个很好的代码生成用于Access。这个我可以嫁给Dapper :)。
您不能使用Entity Framework,因为它不适用于Access数据库。
虽然NH不支持Access开箱即用,但可以将NHibernate与MS Access一起使用。 你需要来自NHibernate.JetDriver的NHContrib和here是NH配置文件的示例设置。
如果我没记错的话,NH Contrib需要根据您正在使用的NH版本进行编译,因此您可能需要下载源代码并自行编译。
作为替代方案,您可以使用众多微ORM中的一种,例如Stack Overflow自己的Dapper。
Dapper与数据库无关,因此它可以连接到包括Access在内的所有内容。从官方网站引用:
dapper会不会与我的数据库提供商一起工作? Dapper没有特定于DB的实现细节,它适用于所有.net ado提供程序,包括sqlite,sqlce,firebird,oracle,mysql和SQL Server
缺点是因为Dapper是DB不可知的,你必须自己实现一些高级的东西,比如qazxsw poi。
编辑:
IMO Dapper处于“相当容易快速运行的类别”中。 看看这个: (paging)
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
(> = .NET 4.0),这意味着动态评估属性,您不需要先定义一个类,但缺点是您丢失了类型安全(和IntelliSense)。
我个人认为,缺少的类型安全对我来说是一个交易破坏者(我更喜欢第一种查询语法),但也许这适合你。
讨厌复活一个旧线程,但我最近使用PetaPoco,微型ORM和MS Access做了一个WPF项目,所以我想我会分享我的实现。
要向PetaPoco添加MS Access支持,您只需添加几个代码:
首先添加一个AccessDatabaseType类。所有DataBaseType类都位于PetaPoco.cs文件的末尾。只需在SqlServerDatabaseType之后添加新类。
IEnumerable<Dynamic>
接下来,修改PetaPoco.Internal.DatabaseType.Resolve()以支持AccessDatabaseType。 (此代码假定您使用的是Jet OLEDB提供程序)
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使用此:
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假设您的主键是自动编号/身份字段。如果您的PK不是自动编号,或者您有复合PK,则需要实现自己的插入和保存逻辑。
- 我不需要在我的应用程序中进行分页,所以我没有实现它。
我们正在使用Db = New PetaPoco.Database("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:db.mdb", "System.Data.Oledb")
。这样我们以后可以轻松移植到另一个数据库。
它没有上面提到的所有限制并且效果很好。
Tortuga Chain完全支持Access。
以上是关于我可以在Access 2007 - 2010中使用哪些ORM?我是在WPF绑定到表等之后的主要内容,如果未能解决你的问题,请参考以下文章
在 Access 2010 中查看时,Access 2007 表单中的幻影框
Access 2007 - 2010 可以使用啥 ORM?我在 WPF 绑定到表等之后
在 Linux 上将 PHP 与 MS Access 2007-2010 连接
使用 ms access 2007 和 ado 部署 delphi 2010 以进行数据库连接所需的文件