我可以在Access 2007 - 2010中使用哪些ORM?我是在WPF绑定到表等之后

问题描述 投票:6回答:4

我有一个所有网站都有的遗留数据库,它描述了许多catagory / subcatagory /子项目格式的特定内容。到目前为止,添加/编辑内容是表格中的手动工作或原始sql Windows Forms工具(我在工作中开始构建!)。

我希望实体框架样式拖放,绑定和运行WPF 4.5和.net 4.5的编码能力。

我对使用NHibernate犹豫不决,因为EF5非常简单,我理解Nhibernate更多的工作(虽然更快的ORM)。有替代方案效果很好吗?如果可能的话,我试图避免过多的手动设置。编辑器不是一个强制性的项目,我不能证明它有很多额外的工作 - 但是如果将它的一个很好的版本放在一起,这将使我的工作在接下来的两年更容易。

反对Access的所有论据我都非常清楚:) - 交换这个至少一年不是一个选择。

在搜索了StackOverflow网站后,我没有看到太多问题,但是如果我错过了一个好的问题,我会道歉!

感谢您提出的任何建议!

更新:我认为我应该稍微改进我的问题,因为我需要在代码生成中获得什么,这样我就不需要为Access数据库构建所有类了。从我所看到的,Dapper的工作是围绕效率,但不同于生成代码。来自实体框架的思维模式,我可以看到我在思考中将任务联合起来:)。所以除了煮我自己 - 有没有人知道一个很好的代码生成用于Access。这个我可以嫁给Dapper :)。

database entity-framework nhibernate orm ms-access-2007
4个回答
7
投票

您不能使用Entity Framework,因为它不适用于Access数据库。

虽然NH不支持Access开箱即用,但可以将NHibernate与MS Access一起使用。 你需要来自NHibernate.JetDriverNHContribhere是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)。 我个人认为,缺少的类型安全对我来说是一个交易破坏者(我更喜欢第一种查询语法),但也许这适合你。


5
投票

讨厌复活一个旧线程,但我最近使用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,则需要实现自己的插入和保存逻辑。
  • 我不需要在我的应用程序中进行分页,所以我没有实现它。

0
投票

我们正在使用Db = New PetaPoco.Database("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb", "System.Data.Oledb") 。这样我们以后可以轻松移植到另一个数据库。

它没有上面提到的所有限制并且效果很好。


0
投票

Tortuga Chain完全支持Access。

Jet Entity Framework Provider

© www.soinside.com 2019 - 2024. All rights reserved.