C# .Net 使用多个Dbcontext

最近在公司项目中考虑到数据存储可能使用到不同的数据库,比如配置或常用数据就保存到本地的sqlite数据库中;实时、并发,而且数据量大,可以保存到功能比较强大的数据库,比如PostgreSQL。
网上查了一遍,有不少介绍,但是都不是很完整,而且sqlite数据库使用ef时还需要特别的地方,挺折腾的,现在把过程写下来,以供大家参考,如果有什么不对的地方,请大家多多指正,谢谢。
本地环境:win10, vs 2019。
首先创建新项目,本项目是.net framework4.7版本,因为是要给wpf项目用的,所以新建控制台项目:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020072019222375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjkzNjQ2,size_16,color_FFFFFF,t_70)

项目创建完成后,可以添加几个文件夹:Databases、DbContextes、Entities、Migrations。
首先安装pgsql,网上有很多安装教程,可以参考:
https://blog.csdn.net/qq_42952532/article/details/88877630

然后需要创建pgsql数据库用户,比如我创建一个用户:test,密码:123456,需要把权限都加上:
在这里插入图片描述通过nuget安装Entity Framework最新版本,并安装npgsql及Entityframework6.Npgsql。
在这里插入图片描述

在这里插入图片描述
在文件夹Entities里新建类Class1.cs、Class2.cs

public class Class1
{
[ScaffoldColumn(false)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
///
/// 机柜名称,比如:1、2、3
///
public int Name { get; set; }
}

public class Class2
{
[ScaffoldColumn(false)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
///
/// 机柜名称,比如:1、2、3
///
public int Name { get; set; }
}

在文件夹DbContextes里新建类PgsqlContext.cs
public class PgsqlContext: DbContext
{
public PgsqlContext() : base(“PgsqlContext”)
{

    }

	public DbSet<Class1> Class1s { get; set; }
}

默认没有在app.config里添加数据库连接的配置,需要手动配置一下:

要给不同的数据库创建不同的迁移文件夹及配置,需要用到命令: enable-migrations -ContextTypeName PgsqlContext -MigrationsDirectory Migrations\Pgsql 就是在PM里执行的命令: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200720200200377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjkzNjQ2,size_16,color_FFFFFF,t_70) 同理增加SqliteContext.cs: public class SqliteContext : DbContext { public SqliteContext() : base("PgsqlContext") {
    }

    public DbSet<Class2> Class2s { get; set; }
}

注意:因为sqlite的Dbcontext比较特殊,需要改配置文件及代码,所以需要先把sqlite的迁移做了,要不到时候就做不了迁移了。
同理执行迁移命令:
enable-migrations -ContextTypeName SqliteContext -MigrationsDirectory Migrations\Sqlite
执行后项目如图:
在这里插入图片描述可以通过sqlite数据库工具创建数据库文件,然后在app.config里添加sqlite数据库连接配置:

修改SqliteContext.cs里的连接配置改成“SqliteContext”:
public class SqliteContext : DbContext
{
public SqliteContext() : base(“SqliteContext”)
{

    }

    public DbSet<Class2> Class2s { get; set; }
}

通过nuget安装system.data.sqlite,并安装System.Data.SQLite.EF6.Migrattions:
在这里插入图片描述在这里插入图片描述并修改配置文件:

在这里插入图片描述
把Migrations\Sqlite里的Configuration.cs改成:
internal sealed class Configuration : DbMigrationsConfiguration<ConsoleApp1.DbContextes.SqliteContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @“Migrations\Sqlite”;
SetSqlGenerator(“System.Data.SQLite”, new SQLiteMigrationSqlGenerator());
}

    protected override void Seed(ConsoleApp1.DbContextes.SqliteContext context)
    {
        if (context.Class2s.Count() == 0)
        {
            context.Class2s.Add(new Entities.Class2() { Name = 1 });
            context.SaveChanges();
        }
    }
}

SqliteContext.cs也要改成:
public class SqliteContext : DbContext
{
public SqliteContext() : base(“SqliteContext”)
{

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new CheckAndMigrateDatabaseToLatestVersion<SqliteContext, Configuration>(true));
    }

    public DbSet<Class2> Class2s { get; set; }
}


/// <summary>
/// https://stackoverflow.com/questions/10822618/confusion-over-ef-auto-migrations-and-seeding-seeding-every-program-start
/// </summary>
/// <typeparam name="TContext"></typeparam>
/// <typeparam name="TMigrationsConfiguration"></typeparam>
public class CheckAndMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
: MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
where TContext : DbContext
where TMigrationsConfiguration : DbMigrationsConfiguration<TContext>, new()
{
    public CheckAndMigrateDatabaseToLatestVersion(bool useSuppliedContext) : base(useSuppliedContext)
    {

    }

    public override void InitializeDatabase(TContext context)
    {
        var migratorBase = ((MigratorBase)new DbMigrator(Activator.CreateInstance<TMigrationsConfiguration>()));

        if (migratorBase.GetPendingMigrations().Any())
        {
            migratorBase.Update();
        }
    }
}

然后执行生成迁移:
Add-Migration -ConfigurationTypeName ConsoleApp1.Migrations.Pgsql.Configuration initialPgsql
Add-Migration -ConfigurationTypeName ConsoleApp1.Migrations.Sqlite.Configuration initialSqlite
最后项目:
在这里插入图片描述需要该一下test.db的属性:改为始终复制/如果较新则复制
最后可以执行更新数据库了:
update-database -ConfigurationTypeName ConsoleApp1.Migrations.Pgsql.Configuration
update-database -ConfigurationTypeName ConsoleApp1.Migrations.Sqlite.Configuration

代码:
链接:https://pan.baidu.com/s/1vyzZxy-T_nOb5d7KSl_yoQ
提取码:1234

sqlite的详细代码可以参考博客:
https://www.cnblogs.com/swobble/p/10881756.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值