Модель использования Entity Framework для разных провайдеров - PullRequest
3 голосов
/ 18 октября 2010

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

Вот моя строка подключения

<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" />

Когда я пытаюсь запросить модель сущности, я получаю следующую ошибку:

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?

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

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

Подготовка модели Entity Framework для поддержки нескольких поставщиков

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

3 голосов
/ 04 ноября 2015

Да, я только что столкнулся с той же проблемой - наше приложение использует 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" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...