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