关于 wpf:Caliburn.Micro MEF SQL CE 一起产生异常无法打开\\’Db\\\\Some.sdf\\’。未安装提供程序 \\’System.Data.SqlServerCe.3.5\\’

Caliburn.Micro + MEF + SQL CE together produce exception Cannot open 'Db\Some.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed

嗨,我真的对这种行为感到困惑。我在我的 WPF 应用程序中使用 Caliburn.Micro 作为 MVVM 框架,MEF 用于导出视图模型类。

现在我需要在我的应用程序中使用 SQL compact DB。所以我用 sqlmetal 创建 *dbml 文件,因为在访问数据库时我想使用 LINQ TO SQL。

首先我创建一个简单的类来执行 CRUD 操作 DB。

这里是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface IDbManager{}

   [Export(typeof(IDbManager))]
    public class DbManager : IDbManager
    {
        //_dc is DataContext class
        private Spiri_SQL_CE_DB _dc;

        public DbManager()
        {
            //string connStr = System.Configuration.ConfigurationManager.AppSettings["connstr"];
            //_dc = new Spiri_SQL_CE_DB(connStr);

            _dc = new Spiri_SQL_CE_DB(@"Db\\Spiri_SQL_CE_DB.sdf");
        }
    }

该类用于视图模型类,即 WPF 窗口。

1
2
3
4
5
6
7
8
9
10
11
12
13
 [Export(typeof(IArchiveViewModel))]
    public class ArchiveViewModel :Screen,IArchiveViewModel
    {

        private IDbManager _dbManager;

        [ImportingConstructor]
        public ArchiveViewModel(IDbManager dbManager)
        {
            _dbManager = dbManager;
        }

    }

我使用 WindowManager 类从屏幕打开这个窗口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  [Export(typeof(IMessengerViewModel))]
    public class MessengerViewModel : Screen, IMessengerViewModel
    {

        private IWindowManager _windowManager;

        [ImportingConstructor]
        public MessengerViewModel(IWindowManager windowManager)
        {
            _windowManager = windowManager;
            OpenArchive();
        }

        public void OpenArchive()
        {
            var w =  IoC.Get<IArchiveViewModel>();
            _windowManager.ShowWindow(w);
        }

如果我运行应用程序,我会收到此错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information.

1) Cannot open 'Db\\Spiri_SQL_CE_DB.sdf'. Provider 'System.Data.SqlServerCe.3.5' not installed.

Resulting in: An exception occurred while trying to create an instance of type 'Spirit.DbManager.DbManager'.

Resulting in: Cannot activate part 'Spirit.DbManager.DbManager'.
Element: Spirit.DbManager.DbManager -->  Spirit.DbManager.DbManager -->  AssemblyCatalog (Assembly="Spirit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

Resulting in: Cannot get export 'Spirit.DbManager.DbManager (ContractName="Spirit.DbManager.IDbManager")' from part 'Spirit.DbManager.DbManager'.
Element: Spirit.DbManager.DbManager (ContractName="Spirit.DbManager.IDbManager") -->  Spirit.DbManager.DbManager -->  AssemblyCatalog (Assembly="Spirit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")


    }

我真的对这个错误感到困惑:

1) 无法打开"Db\\\\Spiri_SQL_CE_DB.sdf"。未安装提供程序"System.Data.SqlServerCe.3.5"。

因为:

  • 我使用 Window 7 x64,我已经为 .NET4.0、.NET3.5 安装了 SQL Server CE
  • WPF 使用 .NET4.0 并且是 x86
  • 在 WPF 中,我参考了程序集 system.data.sqlserverce.dll

我创建了一个小型 repo 项目,但我得到了同样的错误:

你可以在这里找到回购项目:http://netload.in/dateiy4s4jdPyCj/DbTest.7z.htm

我认为问题代码在这里:

1
_dc = new Spiri_SQL_CE_DB(@"Db\\Spiri_SQL_CE_DB.sdf");

Spiri_SQL_CE_DB 类来自 *.dbml 文件。

我在没有 MEF 的情况下创建视图模型类我得到了同样的错误!

所以我尝试在没有 Calibur.Micro 和 MEF 的 WPF 应用程序中使用 DbManager 类,效果很好。

我真的不知道什么是坏的,我用谷歌搜索了 2 小时,但任何建议都不能解决这个错误。

如果有人能帮助我,我会很高兴。


重新安装 3.5 SP2 MSI,如果您有 x64 系统,请同时安装 x86 和 x64 MSI:http://www.microsoft.com/downloads/en/details.aspx?familyid=E497988A-C93A-404C -B161-3A0B323DCE24