2016-12-22 9 views
4

У меня есть отношения «многие ко многим» между двумя объектами. Все работает нормально. Есть ли способ определить имена FK в промежуточной таблице (StoresPushNotifications)?Определите имена FK во многих отношениях.

Причина в том, что mysql не позволяет определять длинные имена ограничений. Он генерирует случайный FK в случае. Он прерывает миграцию, когда я пытаюсь установить переход на более ранний шаг.

[Table("Stores")] 
public class StoreEntity 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual ICollection<PushNotificationEntity> PushNotifications { get; set; } 
} 


[Table("PushNotifications")] 
public class PushNotificationEntity 
{ 
    [Key] 
    public int Id { get; set; } 
    public ICollection<StoreEntity> Stores { get; set; } 
} 

В моем файле контекста,

modelBuilder.Entity<StoreEntity>() 
    .HasMany<PushNotificationEntity>(s => s.PushNotifications) 
    .WithMany(c => c.Stores)     
    .Map(cs => 
    { 
     cs.MapLeftKey("StoreId"); 
     cs.MapRightKey("PushNotificationId"); 
     cs.ToTable("StoresPushNotifications"); 
    }); 

ответ

0

У меня была аналогичная проблема, и она была на самом деле связано с ключевой миграции lengthrather, чем внешние ключи.

я решил, изменив метод конфигурации миграции для:

internal sealed class Configuration : DbMigrationsConfiguration<CCDatabase.CCDbContext> 

public Configuration() 
{ 
    AutomaticMigrationsEnabled = false; 
    MigrationsDirectory = @"Migrations"; 

    SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); 

    SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); 
} 

, а затем добавить этот метод, чтобы ограничить длину ключа

public class MySqlHistoryContext : HistoryContext 
{ 

    public MySqlHistoryContext(DbConnection connection, string defaultSchema) : base(connection, defaultSchema) 
    { 

    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); 
     modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); 
    } 
} 
+0

Да Питер, проблема вы упомянули также там. Но здесь это была длина FK. В этом случае, когда я вернусь к более ранней версии миграции, EF не смог найти FK в промежуточной таблице в БД. Причина в том, что имя FK в БД отличается от того, что EF ищет. Если я изменил имя таблицы «PushNotifications» на что-то вроде «PN», проблема исчезла. – sajith

+0

и Peter для вашей проблемы. Следуйте этому, это решение прост. http://stackoverflow.com/a/27082231/443389. Спасибо – sajith

+0

Спасибо, решение, которое я использовал, было два выше того, что было здесь связано - я думаю, ваше предложение выглядит лучше. –