使用Entity Framework 4.3与SQL Server Compact 4.0.0.1

5

错误:

无法加载 System.Data.SqlServerCe.Entity.dll 文件。请重新安装 SQL Server Compact。

内部异常:

{"无法加载文件或程序集 'System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91' 或其中一个依赖项。所定位的程序集清单定义与程序集引用不匹配。(HRESULT 异常: 0x80131040)":"System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"}

重现步骤:

  1. Create new MVC3 Application

  2. Add Nuget Package EntityFramework.SqlServerCompact

    <package id="EntityFramework.SqlServerCompact" version="4.1.8482.2" />

  3. Create Model

    public class TaskItem
    {
        [Key]
        public int Id { get; set; }
        public string Description { get; set; }
    }
    
  4. Create DbContext

    public class TestContext : DbContext
    {
        public DbSet<TaskItem> TaskItems { get; set; }
    }
    
  5. Home Controller

    public ActionResult Index()
    {
        var db = new TestContext();
        // breakpoint on Add() below
        db.TaskItems.Add(new TaskItem { Description = "Get shit done."});
        return View();
    }
    
  6. Web.config Connection String and Runtime and System.Data

    <add name="ApplicationServices" connectionString="Data Source=|DataDirectory|Test.sdf" providerName="System.Data.SqlServerCe.4.0" />

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SqlServerCe.4.0" />
          <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </DbProviderFactories>
      </system.data>
    

问题:

Web.config文件全部是默认的...没有什么奇怪的东西...所有的DLL都是复制到本地并放在bin目录下...我错过了什么吗?肯定是非常简单的事情。


更新:

从web.config文件中删除Dependent Assembly部分解决了问题,但我仍然需要一个解释来结束答案。

2个回答

7

从web.config中删除相关的程序集绑定

  <dependentAssembly>
    <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
  </dependentAssembly>

我曾经遇到过类似的问题。4.0.0.1版本明显存在,但是直到我移除了绑定重定向后,我才不再遇到和OP一样的错误。 - Ben Foster
Kori,我删除了相同的部分,似乎也解决了崩溃问题。在我标记答案之前,我想知道原因,因为这是一个开箱即用的安装程序。如果您能找到明确的答案,我会给您发支票。同时,感谢您提供的修复方法。 - one.beat.consumer

0

检查此代码是否已在您的项目中创建

EntityFramework.SqlServerCompact.cs under the App_Start folder

using System.Data.Entity;
using System.Data.Entity.Infrastructure;

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyStory.Tests.App_Start.EntityFramework_SqlServerCompact), "Start")]

namespace MyStory.Tests.App_Start {
    public static class EntityFramework_SqlServerCompact {
        public static void Start() {
            Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
        }
    }
}

在我的情况下,我无法在我的web.config中找到“System.Data.SqlServerCe”的dependentAssembly元素,那么尝试删除它们然后再试一次怎么样? - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接