【问题标题】:Entity Framework Multiple DbContexts With Multiple MySql Schemas具有多个 MySql 模式的实体框架多个 DbContext
【发布时间】: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; }
}

【问题讨论】:

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


    【解决方案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。你不能
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2017-10-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多