Сначала встраивается Firebird и код EntityFramework: как правильно установить строку подключения и провайдера?

Я должен использовать встроенную базу данных Firebird и Entity Framework. Я скачал Соединитель, и если я использую этот код:

using FirebirdSql.Data.FirebirdClient;

[...]

string exePath = Path.GetDirectoryName(
    new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);

FbConnectionStringBuilder fbStringBuilder = new FbConnectionStringBuilder();
fbStringBuilder.ServerType = FbServerType.Embedded;
fbStringBuilder.UserID = "SYSDBA";
fbStringBuilder.Password = "MASTERKEY";
fbStringBuilder.Dialect = 3;
fbStringBuilder.Charset = "UTF8";
fbStringBuilder.ClientLibrary = Path.Combine(exePath, "fbembed.dll");
fbStringBuilder.Database = Path.Combine(exePath, "test.fdb");


if (!File.Exists(Path.Combine(exePath, "test.fdb")))
{
    FbConnection.CreateDatabase(fbStringBuilder.ToString());
}

FbConnection fbConn = new FbConnection(fbStringBuilder.ToString());

try
{
    fbConn.Open();

    Console.WriteLine("OK");
}
catch (Exception ex)
{
    Console.WriteLine("ERROR");
    Console.WriteLine(ex.Message);
    Console.ReadKey();
}
finally
{
    fbConn.Close();
}

Все работает. Но когда я пытаюсь использовать эту строку соединения с DbContext:

public class FirebirdEmbededExampleDbContext : DbContext
{
    public FirebirdEmbededExampleDbContext(string connString) : base(connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }

    public DbSet<ItemA> ItemsA { get; set; }
    public DbSet<ItemB> ItemsB { get; set; }
}

это терпит неудачу с сообщением:

Unsupported keyword: 'server type'

Похоже, EF не использует провайдера Firebird. Как я должен использовать это?

3 ответа

Решение

Ваш DbContext должен выглядеть так:

public class FirebirdEmbededExampleDbContext : DbContext
{
    public FirebirdEmbededExampleDbContext(string connString) 
      : base(new FbConnection(connString), true)
    { }

    public DbSet<ItemA> ItemsA { get; set; }
    public DbSet<ItemB> ItemsB { get; set; }
}

Вы должны дать ему понять, что он должен использовать FirebirdClient,

Я искал что-то и нашел эти ресурсы. Надеюсь, это поможет вам:

Использование встроенного сервера Firebird
Пользователь =SYSDBA;Password= MASTERKEY;Database=SampleDatabase.fdb;DataSource= локальный; Порт =3050; Диалект =3;Charset= НЕТ; Роль =; Время жизни соединения =15; Пул =true; MinPoolSize=0;MaxPoolSize=50; Размер пакета =8192;ServerType=1;

Это ключ / значение ServerType = 1; это говорит водителю, что он находится во * встроенном режиме.*

И с сайта Firebird: http://www.firebirdsql.org/en/net-examples-of-use/

Из Firebird_v2.1.4.InstallationGuide.pdf из встроенного пакета:

Клиентский доступ может быть только через локальный протокол (XNET), т.е. НЕ является строкой локального петлевого соединения TCP/IP, которая включает имя сервера "localhost" или IP-адрес 127.0.0.1. Встроенный сервер поддерживает только локальное подключение к абсолютному пути к файлу базы данных без имени сервера.

так это DataSource=localhost не поддерживается (когда я запускаю этот код, я получаю ту же ошибку с Unsupported keyword: 'datasource')

Но есть еще одна вещь. В FAQ сказано ( http://www.firebirdsql.org/en/firebird-net-provider-faq/):

  1. Какие версии MS.NET Framework поддерживаются?

.NET 1.0,.NET 1.1,.NET 2.0 и.NET Compact Framework 2.0

но в разделе загрузки сказано ( http://www.firebirdsql.org/en/net-provider/):

5 октября 2013 г. - NETProvider-3.2.0.0.msi - 815 КБ - FirebirdClient, установщик Windows

5 октября 2013 г. - NETProvider-3.2.0.0-NET40.7z - 322 КБ - FirebirdClient - .NET 4.0

5 октября 2013 г. - NETProvider-3.2.0.0-NET45.7z - 349 КБ - FirebirdClient - .NET 4.5

Итак, разъем предназначен для NET 4.0/4.5, но embeded говорит, что поддерживает только NET 2.0? Я немного смущен...

Другие вопросы по тегам