Изменить поставщика Entity Framework в конфигурации - PullRequest
3 голосов
/ 24 февраля 2011

Я надеялся, что смогу переключить поставщиков данных на / с SQL Server и SQL Server Compact Edition, просто изменив конфигурацию.Но это не работает и, глядя на файл EDMX, я думаю, я понимаю, почему:

<edmx:StorageModels>
<Schema ... Provider="System.Data.SqlClient" ...

Есть ли способ указать провайдера в app.config или во время выполнения?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Storage-Model привязана к конкретному поставщику, что приведет к тому, что Entity Framework отклонит любые реализации DbConnection, которые не совместимы с указанным поставщиком.

Если вы посмотрите на строку подключения Entity Framework, вы увидите, что StorageSchema, ModelSchema и Mapping указываются в трех разных файлах (которые генерируются из вашего .edmx и затем внедряются в сборку). Вы можете разобрать ваш .edmx и встраивать .ssdl, .csdl и .msl самостоятельно, а затем создать другой .ssdl для SQL Server CE. Это в основном просто копирование и вставка, замена поставщика и некоторых типов столбцов.

Я писал здесь: Сравнение Entity Framework

1 голос
/ 10 июня 2011

Для модульных тестов я изменяю схему таким образом (меняя ssdl перед выполнением основного кода).

В коде:

    var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("Model1.ssdl");
    var ssdlFilePath = "<some-dir>\file1.ssdl";
    using (var file = File.Create(ssdlFilePath))
    {
        StreamUtil.Copy(s, file);
    }
    var str = File.ReadAllText(ssdlFilePath);
    str = str.Replace("old provider token", "ProviderManifestToken=\"4.0\"");
    str = str.Replace("old provider type"", "Provider=\"System.Data.SqlServerCe.4.0\"");
    File.WriteAllText(ssdlFilePath, str);

В app.config:

  <connectionStrings>
    <add name="Database2Entities" connectionString="metadata=res://*/Model1.csdl|<some-dir>\file1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\Database1.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

Работает)

...