具有多个 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的主要内容,如果未能解决你的问题,请参考以下文章