Строка подключения для использования SQL Server Compact с Entity Framework? - PullRequest
10 голосов
/ 04 августа 2011

Я закончил пытаться Google для этого. Я установил SQL Server CE 4.0 и EF 4.1, но не могу получить правильную строку подключения. Ничто на connectionstrings.com не относится ко мне.

Я просто хочу создать SqlCeEngine объект, но, что бы я ни пытался, я получаю какое-то исключение. Совсем недавно это было

Неизвестная опция подключения в строке подключения

с метаданными, приложением, поставщиком или строкой подключения к поставщику после него. Я знаю, что EF требует метаданных в строке подключения. И я не представляю, как можно обойтись без «строки подключения провайдера».

Пока у меня есть это:

<add name="DBContext" 
     connectionString="provider connection string=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
     providerName="System.Data.EntityClient" />

В какой-то момент у меня было это с метаданными:

<add name="DBContext" 
     connectionString="metadata=res://*/Data.DBContext.csdl|res://*/Data.DBContext.ssdl|res://*/Data.DBContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
     providerName="System.Data.EntityClient" />

Нужны ли метаданные или нет? Что входит в "app" часть строки подключения? Каким должен быть провайдер, System.Data.SqlClient или какая-то версия SQL Server CE? (который я все еще не могу найти, когда пытаюсь добавить ссылки. Мое окно добавления ссылок все еще содержит только System.Data.SqlServerCe версию 3.5.1.0.) Или ничего?

А что должно идти в атрибуте providerName? System.Data.EntityClient правильно? Как будто здесь 10 различных переменных, и каждая комбинация дает мне новую, не менее загадочную ошибку, ни одна из которых не дает ничего полезного в Google. Я в конце своего ума. Это вообще возможно?

Ответы [ 5 ]

13 голосов
/ 07 апреля 2013

Вы можете попробовать это в своем файле App.config (первые миграции кода EF5 и SQL Server CE 4.0):

<connectionStrings>
    <add name="DefaultConnection"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=|DataDirectory|\Data\ProjectDb.sdf"/>
</connectionStrings>

А у вас ProjectDb класс:

class ProjectDb : DbContext
{
    public ProjectDb()
        : base("DefaultConnection")
    {

    }
}

Это будет работать как шарм.

Вы можете найти больше информации здесь: http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx

6 голосов
/ 06 ноября 2012

Я застрял с той же проблемой в Entity Framework 5.0 Code First подход к SQL Server Compact Edition 4.0

Чтобы решить эту проблему, я передаю экземпляр SqlCeConnection конструктору DbContext:

public class Storage : DbContext
{
    public Storage()
        : base(new SqlCeConnection("Data Source=Database.sdf;Persist Security Info=False;"),
             contextOwnsConnection: true)
    { }

    //...
}

Если вы не хотите вставлять строку подключения, вы можете получить ее от App.config до ConfigurationManager И, конечно, вы должны добавить ссылку на правильную версию System.Data.SqlServerCe (загляните внутрь вкладки «Расширения» в диалоговом окне «Добавить ссылку»)

0 голосов
/ 09 февраля 2015

Вы немного перепутали.

Для SQL Server CE строка подключения может быть довольно простой (возможно, замените DbContext на YourNameSpace.DbContextName):

<add name="DbContext" 
     connectionString="MyDbFile.sdf" 
     providerName="System.Data.SqlServerCe.4.0" />

У меня также было много проблем с соединениями, поэтому я сделал следующее:

  • установленный Entity Framework для SQL Server CE
  • Проверено, что web.config содержит провайдера с инвариантом System.Data.SqlServerCe.4.0
  • Проверено, что НЕТ строковых полей (которые будут представлены в виде столбцов в дБ) длиной не более 4000 символов (для добавления ограничения используйте аннотацию [MaxLength(4000)], по умолчанию == MAX)

Метаданные необходимы, когда вы используете модель базы данных вместо кода сначала, поэтому существует файл .edmx, представляющий сгенерированную модель базы данных.

0 голосов
/ 17 января 2013

Решение Lu55 у меня не сработало, но я нашел способ его исправить. Чтобы по-прежнему использовать автоматическую генерацию кода (которая может перезаписывать изменения в сгенерированном файле), я добавил еще один файл со следующим кодом:

using System.Data.Entity;
using System.Data.Objects;

namespace MyProject.Data
{
    internal partial class Entities : DbContext
    {
        public Entities(string connectionString)
            : base(
                new ObjectContext(
                        @"metadata=res://*/Data.Model.csdl|
                                   res://*/Data.Model.ssdl|
                                   res://*/Data.Model.msl;
                          provider=System.Data.SqlServerCe.4.0;"),
                true)
        {
            Database.Connection.ConnectionString = connectionString;
        }
    }
}
0 голосов
/ 04 августа 2011

В этой статье TechNet описаны шаги по использованию EF с SQL Server Compact.Эта строка выскочила на меня и может решить ваши проблемы:

убедитесь, что provider = System.Data.SqlServerCe.3.5 в строке подключения.

(я бы предположил, что вы бы хотели 4.0 вместо 3.5)

Попробуйте и посмотрите, как идут дела.

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