2016-10-27 5 views
2

Я пытаюсь реализовать два DbContexts, которые сопоставляются с двумя отдельными схемами/базами данных в MySql с внешним ключом между ними.Entity Framework Несколько DbContexts с несколькими схемами MySql

Я понимаю вопросы, подобные этим было предложено раньше, но я не могу найти ответ в отношении MySql

Я использую код первой, но и я получаю следующее сообщение об ошибке, когда я Обновление базы данных:

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

Это мое заявление обновление базы:

обновление базы данных--ConfigurationTypeName MultipleDbContext.Migrations.Configuration

Спасибо!

EDIT - Добавление Entity объектов

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

Проблема, вероятно, в том, что у вас есть строковое свойство в качестве первичного ключа для вашего пользователя, а длина этого ключа слишком долго для MySql. Я считаю, что ограничение составляет 96 символов для ключей (767 байт).

Способ справиться с этим состоит в том, чтобы взять только подмножество свойства строки и применить это к ключу. Чтобы сделать это ясно, следующее показывает ключ, длина которого составляет всего 4 символа.

CREATE TABLE IF NOT EXISTS `foo` (
    `id` varchar(128), 
    PRIMARY KEY (`id`(4)), 
) 

Я предлагаю идти олл-ин с целыми первичными ключами для Aspnet.Identity стеки - а также делают tablenames строчных буквы, так как это будет проблема на сервере MySQL организован с помощью чувствительных к регистру файловых систем.

Это GitHub repo является своего рода излишеством в качестве примера, но им указывая несколько points in the code here

Кроме того, этот ответ имеет nice walkthrough

+0

Спасибо за ответ, но я использую Int как для первичных ключей. Я не использую Identity, я просто назвал объекты похожими именами. – SkelDave

+0

Ах, я пропустил часть, которую вы разделили на два разных соединения с базой данных. Просто невозможно, чтобы один контекст соединял запрос с другим контекстом. То, что вы, по сути дела, выполняете с помощью сопоставления внешнего ключа, - это 'select * from Application app join Присоединиться к User on App.X = User.Y' в * одном одном запросе *.Ты не можешь – mschr