C#.NetFramwork真正实现sqlite ef6 codefirst

nuget包引入system.data.sqlite和sqlite.codefirst及其相关依赖项

创建代码模型(要注意 codefirst会自动在数据库中创建名为MyModels的表)

public class MyModel
{
    public int Id { get; set; }

    public string Content { get; set; }

}

创建两个类

public class MyConfiguration : DbConfiguration, IDbConnectionFactory
{
    public MyConfiguration()
    {
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);

        var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));

        SetProviderServices("System.Data.SQLite", providerServices);
        SetProviderServices("System.Data.SQLite.EF6", providerServices);

        SetDefaultConnectionFactory(this);
    }

    public DbConnection CreateConnection(string connectionString)
        => new SQLiteConnection(connectionString);
}
[DbConfigurationType(typeof(MyConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }
    public DbSet<MyModel> Table { get; set; }
}

调用部分

using (var db = new MyDbContext("data source=d:\\test.db"))
{
    db.Table.Add(new MyModel() { Id=1, TypeName="a" });
    db.SaveChanges();
    var b = db.Table.ToList();
    db.SaveChanges();
}

需要注意

App.config在nuget包安装EntityFramwork时会引入以下内容

作用参考 配置文件设置 - EF6 |微软学习 (microsoft.com) 可以删掉不影响功能

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

App.config在nuget包安装system.data.sqlite.ef6时会引入以下内容

注意如果上面使用MyConfiguration类重新定义Provider和ProviderFactory时删除以下几项

  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <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>
  </system.data>

其中providers设定项对应代码

var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));

SetProviderServices("System.Data.SQLite", providerServices);
SetProviderServices("System.Data.SQLite.EF6", providerServices);

DbProviderFactories设定项对应代码

SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值