具有多个MySql架构的实体框架多个DbContexts

时间:2016-10-27 09:17:19

标签: c# mysql entity-framework-6 dbcontext

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

我之前已经问过类似的问题,但我找不到与 MySql 相关的答案

我首先使用代码但是当我执行Update-Database时出现以下错误:

  

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

     

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

这些是我的2 DbContexts:

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();
    }
}

这是我的更新数据库声明:

  

update-database -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 个答案:

答案 0 :(得分:0)

问题可能是,您将字符串属性作为用户的主键,并且此键的长度对于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