2016-10-06 4 views
3

Я пытаюсь создать базу данных SQLite, защищенную паролем, чтобы использовать ее в приложении WPF с использованием Entity Framework Core.Защищенный паролем SQLite с Entity Framework Core

Я узнаю, как сгенерировать свой DbContext и Entities из существующего SQLite DB (первый подход базы данных), но я не могу заставить его работать с защищенным паролем DB.

На самом деле, я даже не уверен, как создать защищенную паролем SQLite DB. В чем разница между зашифрованным db и защищенным паролем db?

+0

вы шифруете БД через 'dbCon.SetPassword (myLitePW)' после этого вы используете PW в строке подключения: 'Data Source = c: \ mydb.db; Version = 3; Password = myLitePW;' – Plutonix

+1

Если я не ошибочно, это работает с EF6 (в пакете System.Data.SQLite). Но с EF Core (в пакете Microsoft.Data.SQLite) я не могу найти способ сделать это ... (нет методов SetPassword в SQLiteConnection из Microsoft.Data.SQLite) – fharreau

ответ

4

Согласно этому article и этому issue, нет никакого способа (пока?) Для шифрования базы данных с помощью узла Microsoft.Data.Sqlite (используется EF Core).

Исходя из этого, вот что я сделал, чтобы он работал с EF Core:

  • добавить System.Data.SQLite.Core пакет проекта
  • при настройке вашего DbContext, дайте optionsBuilder ваш собственный DbConnection :

    var conn = new SQLiteConnection(@"Data Source=yourSQLite.db;"); 
    conn.Open(); 
    
    var command = conn.CreateCommand(); 
    command.CommandText = "PRAGMA key = password;"; 
    command.ExecuteNonQuery(); 
    
    optionsBuilder.UseSqlite(conn); 
    

это очень важно использовать SQLiteConnection (который может управлять зашифрованной базой данных) с узла System.Data.SQLite.Core, а не SqliteConnection от Microsoft.Data.Sqlite.


Согласно статье, вы, вероятно, использовали встроенный в SqliteConnection, заменив sqlite3.dll погружен в Microsoft.Data.Sqlite сборки на другом, которые обрабатывают зашифрованную базу данных (вы можете найти бесплатно один на этом repo). Но я не проверял его.

Here - как это сделать!

+1

Когда я использую это Я получил System.ObjectDisposedException: «Не удается получить доступ к удаленному объекту». –

+0

Ну, что-то в вашем коде должно вызывать 'Dispose()' на одном из ваших объектов. Вы используете предложение 'using' где угодно? При выходе из условия использования объект, определенный с ним, автоматически удаляется. – fharreau

+0

Спасибо за ответ, я знаю, как работает работа с предложением, проблема в том, что я использовал ваш код в неправильном месте, и ваш ответ полностью правильный. –

Смежные вопросы