Программно создать строку подключения для сопоставления модели Entity Framework Code-First с существующей базой данных Sql Server Compact - PullRequest
1 голос
/ 02 июля 2011

Я успешно сопоставил модель данных Entity Framework Code-First с существующей базой данных Sql Server Compact с помощью декларативного подхода с использованием app.config, но было бы замечательно, если бы я мог построить такое соединение программно свозможно помощь класса EntityConnectionStringBuilder (System.Data.EntityClient).К сожалению, этот подход не работает, так как [DbContext].Connection.ConnectionString не принимает большинство его свойств.

Вот фактический рабочий код с закомментированным ошибочным:

Book.cs

public class Book
{
    [Key]
    public string Isbn { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string Publisher { get; set; }
    public DateTime Published { get; set; }
    public int Pages { get; set; }
    public bool InStock { get; set; }
    public string Description { get; set; }
}

Catalog.cs

public class Catalog : DbContext
{
    public DbSet<Book> Books { get; set; }
}

app.config

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add
      name="Catalog"
      providerName="System.Data.SqlServerCE.4.0"
      connectionString="Data Source=res/Catalog.sdf"
  />
  </connectionStrings>
</configuration>

Main ()

static void Main()
{
    // var res = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "res");
    // var str = new EntityConnectionStringBuilder();
    // str.Name = "Catalog";
    // str.Provider = "System.Data.SqlServerCe.4.0";
    // str.ProviderConnectionString = String.Format("Data Source {0}", Path.Combine(res, "Catalog.sdf"));

    try
    {
        using (var catalog = new Catalog())
        {
            // catalog.Database.Connection.ConnectionString = str.ConnectionString;

    // remaining code not relevant - skipped

Я пытался использовать другие классы построителя, такие как SqlCeConnectionStringBuilder (System.Data.SqlServerCe), SqlConnectionStringBuilder (System.Data.SqlClient) и даже DbConnectionStringBuilder (System.Data.Common), но, похоже, ни один из них не соответствует ожидаемому [DbContext].Connection.ConnectionString.

Должен ли я заключить, что для этого нет программного способа?Любой совет обязательно будет оценен.Большое спасибо за ваши вклады.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Откройте DbConnection и передайте его конструктору DbContext или используйте DefaultConnectionFactory:

Database.DefaultConnectionFactory
    = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

using (var catalog = new Catalog("Catalog.sdf"))
{
}

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

2 голосов
/ 03 июля 2011

Если вы используете SQL Server Compact 4.0 и DbContext с первым кодом, вы не можете использовать EntityConnectionStringBuilder - он создает строку подключения для EF с файлом EDMX. Вам нужна SqlCeConnectionStringBuilder из System.Data.SqlServerCe сборки с версией 4.0.0.0!

Вы также должны передать строку соединения в экземпляр контекста через конструктор - DbContext имеет конструктор, принимающий имя строки соединения (из конфигурации) или самой строки соединения.

...