栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C# .Net 使用多个Dbcontext

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 Class1s { get; set; }
}

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

要给不同的数据库创建不同的迁移文件夹及配置,需要用到命令: enable-migrations -ContextTypeName PgsqlContext -MigrationsDirectory MigrationsPgsql 就是在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 Class2s { get; set; }
}

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

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

    }

    public DbSet Class2s { get; set; }
}

通过nuget安装system.data.sqlite,并安装System.Data.SQLite.EF6.Migrattions:
并修改配置文件:


把MigrationsSqlite里的Configuration.cs改成:
internal sealed class Configuration : DbMigrationsConfiguration
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @“MigrationsSqlite”;
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(true));
    }

    public DbSet Class2s { get; set; }
}


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

    }

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

        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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号