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
    评论
C#中,DbContext是Entity Framework中的一个类,用于管理数据库连接和操作。通过继承DbContext类,我们可以创建自己的上下文类来表示数据库中的表和实体。 引用\[1\]和\[2\]展示了如何创建两个不同的上下文类PgsqlContextSqliteContext,并分别定义了它们的连接字符串和实体集合。这些上下文类可以通过DbSet属性来公开表示数据库中的表和实体。 引用\[3\]提供了一个示例,展示了如何定义一个包含多个实体集合的上下文类ProductContext。在这个示例中,Categories和Products都是DbSet属性,分别表示数据库中的Category表和Product表。 总结起来,通过继承DbContext类并定义DbSet属性,我们可以创建自己的上下文类来管理数据库连接和操作。这些上下文类可以用于执行各种数据库操作,如查询、插入、更新和删除数据。 #### 引用[.reference_title] - *1* *2* [C# .Net 使用多个Dbcontext](https://blog.csdn.net/qq_34293646/article/details/107470641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [EFCore学习笔记(6)——EF6中使用DbContext](https://blog.csdn.net/BadAyase/article/details/125575287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值