2010-10-17 2 views
3

У меня есть модель сущности 4.0, которая использует базу данных SqlServerCE в качестве ее поставщика. На сервере я хочу использовать тот же проект и просто отключить строку подключения для использования реальной базы данных SqlServer.Модель использования Entity Framework для разных поставщиков

Вот моя строка соединения

<add name="Entities" 
     connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl; 
provider=System.Data.SqlClient; 
provider connection string=&quot; 
Data Source=xxxx; 
Initial Catalog=xxxx;User ID=xxxx;Password=xxxx;&quot;" 
providerName="System.Data.EntityClient" /> 

При попытке запроса Entity Model, я получаю следующее сообщение об ошибке:

SqlCeCommand.CommandTimeout does not support non-zero values. 

Если я установить контекст таймаут в 0, то говорит

Unable to cast object of type 'System.Data.SqlClient.SqlConnection' 
to type 'System.Data.SqlServerCe.SqlCeConnection'. 

Как установить провайдера из SqlServerCE в SqlClient?

ответ

4

Вам нужно сделать немного больше работы, чем просто заменить строку подключения для поддержки разных поставщиков. В этой статье объясняется, как поддерживать более одного поставщик:

Preparing an Entity Framework model for multi provider support

В статье рассматривается поддержка VistaDB и SQL Server, но те же принципы применяются.

+1

Немного поработал, но у меня это получилось. Все еще не может загрузить его в качестве ресурса. Если вы переходите от sqlserverCE к sqlserver, вам нужно добавить атрибуты Schema. – Kenoyer130

3

Да, я просто пришел к той же проблеме - наше приложение использует SQL Server, но модульные тесты выполняются с использованием SQL Server CE. Я прочитал статью, предоставленную Kev, и придумал усовершенствование автоматизации, чтобы предотвратить ручное копирование файла.

Предполагая, что «Метаданные Артефакт Обработка» установлено значение «Вставить в выходной сборки» вы можете следующим образом:

public void SetupOnce() 
    { 
     var assembly = typeof(TContext).Assembly; 
     var ssdlRes = assembly.GetManifestResourceNames().Single(e => e.EndsWith("ssdl")); //TODO handle multiple contexts 

     using (var stream = assembly.GetManifestResourceStream(ssdlRes)) 
     using (var reader = new StreamReader(stream)) 
     { 
      var result = reader.ReadToEnd().Replace("Provider=\"System.Data.SqlClient\"", "Provider=\"System.Data.SqlServerCe.4.0\""); 
      File.WriteAllText(ssdlRes, result); 
     } 

     Context = new TContext(); 
    } 

И строка соединения затем устанавливается:

<add name="DomainDbContext" 
    connectionString="metadata=res://*/Entities.Entities.csdl|./Entities.Entities.ssdl|res://*/Entities.Entities.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=StraDaLB_DM.sdf&quot;" 
    providerName="System.Data.EntityClient" /> 

Надежда это помогает кому-то когда-нибудь;)

Смежные вопросы