6

我有一个所有网站都有的旧数据库,它以多种类别/子类别/子项目格式描述特定内容。到目前为止,添加/编辑内容要么是在表格中手动工作,要么是原始 sql Windows 窗体工具(我是在开始工作时构建的!)。

我想要具有 WPF 4.5 和 .net 4.5 的实体框架样式拖放、绑定和运行编码能力。

我对使用 NHibernate 犹豫不决,因为 EF5 使用起来非常简单,我知道 Nhibernate 需要更多工作(尽管 ORM 更快)。有没有效果很好的替代品?如果可能的话,我试图避免过多的手动设置。编辑器不是一个强制性项目,我不能证明在它上面做很多额外的工作是合理的——但如果把它的一个好的版本放在一起,它会让我在接下来的 2 年里的工作更轻松。

我非常清楚所有反对 Access 的论点 :) - 至少一年内都不能选择交换它。

搜索了 StackOverflow 站点后,我没有看到太多的问题,但如果我错过了一个好的问题,我深表歉意!

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

4

4 回答 4

6

您不能使用实体框架,因为它不适用于 Access 数据库。

可以将 NHibernate 与 MS Access 一起使用,尽管 NH 不支持开箱即用的 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 无关,所以你必须自己实现一些高级的东西,比如paging


编辑:

IMO Dapper属于“相当容易快速运行的类别”。
看看这个:(
完整的演示项目在这里

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),这意味着属性是动态评估的,您不需要之前定义类,但缺点是您失去了类型安全性(和 IntelliSense)。
我个人的观点是,缺少类型安全性对我来说是一个交易破坏者(我更喜欢第一个查询语法),但也许这适合你。

于 2013-01-03T14:21:44.857 回答
5

讨厌复活一个旧线程,但我最近做了一个 WPF 项目,使用 PetaPoco,一个微 ORM,和 MS Access,所以我想我会分享我的实现。

要将 MS Access 支持添加到 PetaPoco,您只需添加几段代码:

首先添加一个 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,您需要实现自己的插入和保存逻辑。
  • 我的应用程序不需要分页,所以我没有实现它。
于 2015-01-07T20:13:16.277 回答
0

我们正在使用 Jet Entity Framework Provider。这样我们以后可以轻松地移植到另一个数据库。

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

于 2017-03-09T15:07:09.860 回答
0

Tortuga Chain 完全支持 Access。

https://docevaad.github.io/Chain/Introduction.htm

于 2017-12-22T07:56:52.030 回答