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

Ric*_*ths 6 database nhibernate orm entity-framework ms-access-2007

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

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

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

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

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

感谢您提出的任何建议!

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

Chr*_*cht 7

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

虽然NH不支持Access开箱即用,但可以将NHibernate与MS Access一起使用.
您需要来自NHContrib的NHibernate.JetDriver,这里是NH配置文件的示例设置.

如果我没记错的话,NH Contrib需要根据您正在使用的NH版本进行编译,因此您可能需要下载源代码并自行编译.

作为替代方案,您可以使用众多微ORM中的一种,例如Stack Overflow自己的Dapper.

Dapper与数据库无关,因此它可以连接到包括Access在内的所有内容.从官方网站引用:

dapper会不会与我的数据库提供商一起工作?
Dapper没有特定于DB的实现细节,它适用于所有.net ado提供程序,包括sqlite,sqlce,firebird,oracle,MySQL和SQL Server

缺点是因为Dapper是DB不可知的,你必须自己实现一些有用的东西,比如分页.


编辑:

IMO小巧玲珑在"相当容易快速运行产品类别".
看看这个:
(完整的示范项目在这里)

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例代码中有两个不同的查询.

第一个映射到强类型列表,例如结果是IEnumerable<Product>.当然它需要一个Product可以映射到的类.

第二个查询返回一个IEnumerable<Dynamic>(> = .NET 4.0),这意味着动态评估属性,您不需要先定义一个类,但缺点是您丢失了类型安全性(和IntelliSense).
我个人认为,缺少的类型安全对我来说是一个交易破坏者(我更喜欢第一种查询语法),但也许这适合你.


voo*_*oon 5

讨厌复活一个旧线程,但我最近使用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;");
    }

}
Run Code Online (Sandbox Code Playgroud)

接下来,修改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;
}
Run Code Online (Sandbox Code Playgroud)

最后,要实例化PetaPoco使用此:

Db = New PetaPoco.Database("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb", "System.Data.Oledb")
Run Code Online (Sandbox Code Playgroud)

限制:

  • PetaPoco假设您的主键是自动编号/标识字段.如果您的PK不是自动编号,或者您有复合PK,则需要实现自己的插入和保存逻辑.
  • 我不需要在我的应用程序中进行分页,所以我没有实现它.