Entity Framework Code First默认使用SQL Server,这里提供使用SQLite的方法。
支持NuGet和Entity Framework Code First的Visual Studio。
<connectionStrings>
<add name="UserContext" connectionString="Data Source=|DataDirectory|mydb.db" providerName="System.Data.SQLite.EF6" />
connectionStrings>
同时修改(不加入System.Data.SQLite会出错,参考http://www.codeproject.com/Questions/731487/No-Entity-Framework-provider-found-for-the-ADO-NET)
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
DbProviderFactories>
这样理论上就能通过DbContext
以及DbSet
等Entity Framework Code First的操作了。
using System.Data.SQLite;
namespace Test
{
public class SQLiteDbHelper
{
public const string TABLE_USERS = "Users";
private SQLiteConnection connection;
///
/// Init SQLite DB connectionString.
///
/// SQLite Database file path
public SQLiteDbHelper(string dbFilePath)
{
string connectionString = "Data Source=" + dbFilePath;
connection = new SQLiteConnection(connectionString);
}
///
/// Create DB and tables.
///
public void Create()
{
connection.Open();
SQLiteCommand command = connection.CreateCommand();
command.CommandText = string.Format("CREATE TABLE {0}({1}, {2}, {3}, {4})",
TABLE_USERS, "_id INTEGER PRIMARY KEY AUTOINCREMENT",
"Name VARCHAR", "Email VARCHAR", "Password VARCHAR");
command.ExecuteNonQuery();
connection.Close();
}
}
///
/// Executes a Transact-SQL statement against the connection and returns the number
/// of rows affected.
///
/// sql command
/// The parameters of sql command.
/// The number of rows affected.
public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters)
{
int affectedRows = 0;
connection.Open();
using (DbTransaction transaction = connection.BeginTransaction())
{
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
if (parameters != null)
{
command.Parameters.AddRange(parameters);
}
affectedRows = command.ExecuteNonQuery();
}
transaction.Commit();
}
connection.Close();
return affectedRows;
}
///
/// Sends the command to the connection and builds a SQLiteDataReader.
///
/// sql command
/// The parameters of sql command.
/// A SQLiteDataReader object.
public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parameters)
{
SQLiteCommand command = new SQLiteCommand(sql, connection);
if (parameters != null)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
///
/// Executes the query, and returns the first column of the first row in the result
/// set returned by the query. Additional columns or rows are ignored.
///
/// sql command
/// The parameters of sql command.
/// The first column of the first row in the result set, or a null reference
/// if the result set is empty. Returns a maximum of 2033 characters.
public Object ExecuteScalar(string sql, SQLiteParameter[] parameters)
{
using (SQLiteCommand command = new SQLiteCommand(sql, connection))
{
if (parameters != null)
{
command.Parameters.AddRange(parameters);
}
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
return dataTable;
}
}
}
}
// Init DB.
string dbFilePath = Path.Combine(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), "mydb.db");
SQLiteDbHelper sqliteDbHelper = new SQLiteDbHelper(dbFilePath);
if (!File.Exists(dbFilePath))
{
sqliteDbHelper.Create();
}