我正在尝试实现两个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; }
}
答案 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