Строка подключения для использования SQL Server Compact с платформой Entity Framework?

Я сделал попытку 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" />

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

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

Ответ 1

Вы можете попробовать это в своем файле 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

Ответ 2

Идентификация с той же проблемой в Entity Framework 5.0 Код Первый подход с 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(загляните в вкладку Extentions в диалоговом окне "Добавить ссылку" )

Ответ 3

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

убедитесь, что поставщик = System.Data.SqlServerCe.3.5 в соединении строка.

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

Дайте попробовать и посмотрите, как все идет.

Ответ 4

Решение 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;
        }
    }
}

Ответ 5

Вы немного смешались.

Для строки подключения 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
  • Проверено, что нет строковых полей (которые будут представлены как столбцы в db) с длиной max или режимом, чем 4000 символов (для добавления аннотации использования ограничения [MaxLength(4000)], по умолчанию == MAX)

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