C# 实体框架具有多个MySql架构的多个DBContext

C# 实体框架具有多个MySql架构的多个DBContext,c#,mysql,entity-framework-6,dbcontext,C#,Mysql,Entity Framework 6,Dbcontext,我试图实现两个DBContext,它们映射到MySql中的两个单独的模式/数据库,并在它们之间使用一个外键 我知道以前有人问过类似的问题,但我找不到与MySql相关的答案 我首先使用代码,但在更新数据库时出现以下错误: MultipleDbContext.ApplicationUser::EntityType“ApplicationUser”未定义键。定义此EntityType的键 ApplicationUsers:EntityType:EntitySet“ApplicationUsers”基于

我试图实现两个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);
    }
}
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();
    }
}

问题可能是,您将string属性作为用户的主键,并且该键的长度对于MySql来说太长。我认为密钥的限制是96个字符(767字节)

处理此问题的一种方法是仅获取字符串属性的子集,并将其应用于键。为了说明这一点,下面显示了一个键,它只有4个字符长

CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)
我建议对Aspnet.Identity堆栈使用整型主键,并将表名全部改为小写,因为这在通过区分大小写的文件系统托管的mysql服务器上是个问题

举个例子来说,这有点过分了,但我要指出一些


这个答案也有一个

谢谢你的回答,但我对两个主键都使用int。我没有使用Identity,我只是将对象命名为相似的名称。啊,我错过了将对象拆分为两个不同数据库连接的部分。让一个上下文与另一个上下文连接查询是不可能的。实际上,通过外键映射,您只需在一个查询中执行
select*from Application app join User on app.X=User.Y
。你不能
CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)