在本文中,将探讨如何在不使用SQLite的Entity Framework工具的情况下,通过代码配置来使用SQLite数据库与Entity Framework。Entity Framework 是一个强大的工具,它可以帮助开发者更高效地与数据库进行交互。
首先,需要从NuGet包管理器安装System.Data.Sqlite。打开控制台并输入以下命令:
Install-Package System.Data.SQLite
创建一个名为 'SQLiteWithEF.db' 的SQLite数据库,并创建一个表:
CREATE TABLE EmployeeMaster (
ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
EmpName VARCHAR NOT NULL,
Salary DOUBLE NOT NULL,
Designation VARCHAR NOT NULL
);
接下来,创建一个控制台应用程序,并添加对System.Data.SQLite的引用。
安装完必要的库后,需要配置App.Config文件。除了默认条目外,删除所有条目。App.Config文件应该看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
创建一个名为SQLiteConfiguration.cs的类,并编写以下代码:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core.Common;
using System.Data.SQLite;
using System.Data.SQLite.EF6;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLiteWithEF
{
public class SQLiteConfiguration : DbConfiguration
{
public SQLiteConfiguration()
{
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
}
}
}
请注意,移除了App.Config文件中的条目,并创建了这个配置类,因为通过代码配置Entity Framework看起来更简单,而且App.Config文件不会显示使用的是哪个程序集。
现在,为EmployeeMaster表创建一个模型类:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Linq.Mapping;
using System.Data.SQLite;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLiteWithEF
{
[Table("EmployeeMaster")]
public class EmployeeMaster
{
[Column("ID", IsDbGenerated = true, IsPrimaryKey = true, DbType = "INTEGER")]
[Key]
public int ID { get; set; }
[Column("EmpName", DbType = "VARCHAR")]
public string EmpName { get; set; }
[Column("Salary", DbType = "DOUBLE")]
public double Salary { get; set; }
[Column("Designation", DbType = "VARCHAR")]
public string Designation { get; set; }
}
}
创建一个DatabaseContext.cs类,并将其扩展为DbContext类:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLiteWithEF
{
class DatabaseContext : DbContext
{
public DatabaseContext() : base(new SQLiteConnection()
{
ConnectionString = new SQLiteConnectionStringBuilder() { DataSource = "D:\\Databases\\SQLiteWithEF.db", ForeignKeys = true }.ConnectionString,
}, true)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
base.OnModelCreating(modelBuilder);
}
public DbSet EmployeeMaster { get; set; }
}
}
请注意,必须通过代码创建连接字符串。如果在App.Config文件中创建它,它将不起作用。
现在已经创建了Entity Framework上下文类,可以使用它了。转到Program.cs文件,并尝试通过Lambda或Linq或两者插入、更新、删除和查询数据。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SQLiteWithEF
{
class Program
{
static void Main(string[] args)
{
DatabaseContext context = new DatabaseContext();
Console.WriteLine("Enter Employee name");
string name = Console.ReadLine();
Console.WriteLine("Enter Salary");
double salary = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter Designation");
string designation = Console.ReadLine();
EmployeeMaster employee = new EmployeeMaster()
{
EmpName = name,
Designation = designation,
Salary = salary
};
context.EmployeeMaster.Add(employee);
context.SaveChanges();
var data = context.EmployeeMaster.ToList();
foreach (var item in data)
{
Console.Write(string.Format("ID : {0} Name : {1} Salary : {2} Designation : {3}{4}", item.ID, item.EmpName, item.Salary, item.Designation, Environment.NewLine));
}
Console.ReadKey();
}
}
}
现在,通过按F5或Control+F5运行应用程序并查看结果。
1.Entity Framework总是将ID列视为主键。如果声明了任何其他列为主键,则必须使用System.ComponentModel.DataAnnotations
的[Key]属性对其进行注释。
2. 请确保将SQLiteConfiguration.cs文件放在与上下文类相同的文件夹中。
3. 可能会注意到,从DatabaseContext类中移除了将表名复数化的约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
base.OnModelCreating(modelBuilder);
}
如果删除了这行代码,将得到System.Data.Entity.Infrastructure.DbUpdateException
。