Строка подключения для использования 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="Data Source=MyDbFile.sdf;Persist Security Info=False;""
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="Data Source=MyDbFile.sdf;Persist Security Info=False;""
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
, который представляет сгенерированную модель базы данных.