如何使用autofac实现多个DbContext的注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用autofac实现多个DbContext的注入相关的知识,希望对你有一定的参考价值。

参考技术A 自动根据项目的实体类操作不同的数据库
自己写写一个wrapper。包装一下dbcontext的方法
比如:wrapper.Set<T>() .where.update.delete....
set方法里面根据T创建所对应的dbcontext
参考技术B 在本人接触的项目中Autofac应用的比较多一些,我理解的他的工作原理就是 注册类并映射到接口,通过注入后返回相应实例化的类!
下面说说我在项目中的实际应用:一个接口多个实现的情况本回答被提问者采纳

具有多个 MySql 模式的实体框架多个 DbContext

【中文标题】具有多个 MySql 模式的实体框架多个 DbContext【英文标题】:Entity Framework Multiple DbContexts With Multiple MySql Schemas 【发布时间】:2017-03-09 21:47:55 【问题描述】:

我正在尝试实现两个 DbContext,它们映射到 MySql 中的两个单独的模式/数据库,它们之间有一个外键。

我知道以前有人问过类似的问题,但我找不到与 MySql

相关的答案

我首先使用代码,但是在执行更新数据库时出现以下错误:

MultipleDbContext.ApplicationUser: : EntityType 'ApplicationUser' 没有定义键。定义此 EntityType 的键。

ApplicationUsers: EntityType: EntitySet 'ApplicationUsers' 基于没有定义键的类型'ApplicationUser'。

这些是我的 2 个 DbContext:

ApplicationDbContext

public class ApplicationDbContext : DbContext

    public ApplicationDbContext() : base("ApplicationDBContext") 

    public DbSet<Application> Applications  get; set; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);

        modelBuilder.Configurations.Add(new ApplicationConfiguration());
    


public class ApplicationConfiguration : EntityTypeConfiguration<Application>

    public ApplicationConfiguration()
    
        HasKey(x => x.ApplicationID);
        Property(x => x.ApplicationID).IsRequired();
        Property(x => x.ApplicationName).IsRequired();
        HasRequired(x => x.PrimaryUser).WithMany().HasForeignKey(x => x.UserID);
    

ApplicationUserDbContext

public class ApplicationUserDbContext : DbContext

    public ApplicationUserDbContext() : base("UserDBContext") 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Configurations.Add(new ApplicationUserConfiguration());
    


public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser>

    public DbSet<ApplicationUser> ApplicationUsers  get; set; 

    public ApplicationUserConfiguration()
    
        HasKey(x => x.UserID);
        Property(x => x.UserID).IsRequired();
        Property(x => x.Name).IsRequired();
    

这是我的更新数据库语句:

更新数据库-ConfigurationTypeName MultipleDbContext.Migrations.Configuration

谢谢!

编辑 - 添加实体对象

public class Application

    public int ApplicationID  get; set; 
    public string ApplicationName  get; set; 
    public int UserID  get; set; 
    public virtual ApplicationUser PrimaryUser  get; set; 


public class ApplicationUser

    public int UserID  get; set; 
    public string Name  get; set; 

【问题讨论】:

【参考方案1】:

问题可能是,你有字符串属性作为你的用户的主键,这个键的长度对于 MySql 来说太长了。我相信键的限制是 96 个字符(767 个字节)。

处理这种情况的一种方法是只获取字符串属性的子集并将其应用于键。为了清楚起见,下面显示了一个键,它只有 4 个字符长。

CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)

我建议使用 Aspnet.Identity 堆栈的整数主键 - 并将表名全部设为小写,因为这将是通过区分大小写的文件系统托管的 mysql 服务器上的问题。

这个GitHub repo作为一个例子有点矫枉过正,但我​​指出了一些points in the code here

这个答案还有一个nice walkthrough

【讨论】:

感谢您的回复,但我对两个主键都使用了 int。我没有使用 Identity,我只是将对象命名为相似的名称。 啊,我错过了你分成两个不同的数据库连接的部分。根本不可能让一个上下文将查询与另一个上下文连接起来。您实际上通过外键映射所做的是 一个单一查询中的select * from Application app join User on App.X = User.Y。你不能

以上是关于如何使用autofac实现多个DbContext的注入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Autofac 注入相同的 DbContext 实例来处理 HTTP 请求而不会导致并发问题?

autofac管理dbcontext

AutoFac DbContext 问题 - 在创建模型时无法使用

从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之二autofac解耦

AutoFac实现WebAPI依赖注入(EF以及Mysql)

Autofac注册多个容器