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

Posted

技术标签:

【中文标题】具有多个 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。你不能

以上是关于具有多个 MySql 模式的实体框架多个 DbContext的主要内容,如果未能解决你的问题,请参考以下文章

实体框架数据库首先是多个模式重复的表名

具有多个引用的实体框架 LoadProperty

实体框架 - 将表拆分为具有重叠条件的多个实体

实体框架和多个模式

具有多个连接条件的实体框架查询

实体框架 - 具有挑战性的设置包括多个主键,以及与外部表的多个关联