Использование SQL Server Compact 4.0.0.1 с Entity Framework 4.3 - PullRequest
5 голосов
/ 17 февраля 2012

Ошибка:

Could not load System.Data.SqlServerCe.Entity.dll. Reinstall SQL Server Compact.

Внутреннее исключение:

{"Could not load file or assembly 'System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"}

Шаги для воспроизведения:

  1. Создание нового приложения MVC3

  2. Добавить пакет Nuget EntityFramework.SqlServerCompact

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

  3. Создать модель

    public class TaskItem
    {
        [Key]
        public int Id { get; set; }
        public string Description { get; set; }
    }
    
  4. Создать DbContext

    public class TestContext : DbContext
    {
        public DbSet<TaskItem> TaskItems { get; set; }
    }
    
  5. Домашний контроллер

    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 и время выполнения и 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 решило проблему, но мне все еще нужно объяснение, почему, чтобы закрыть ответ.

Ответы [ 2 ]

7 голосов
/ 17 февраля 2012

Удалите зависимую привязку сборки из вашего 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>
0 голосов
/ 17 февраля 2012

Проверьте, создан этот код или нет в вашем проекте

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");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...