2016-12-22 4 views
4

Ich habe eine Viele-zu-Viele-Beziehung zwischen zwei Entitäten. Alles funktioniert gut. Gibt es eine Möglichkeit, Namen von FKs in der Zwischentabelle (StoresPushNotifications) zu definieren?Definieren Sie FK-Namen in einer Viele-zu-Viele-Beziehung.

Der Grund zu fragen ist, dass mysql nicht erlauben, lange Constraint-Namen zu definieren. Es erzeugt zufällige FK für den Fall. Es bricht die Migration ab, wenn ich versuche, die Migration auf einen früheren Schritt zu setzen.

[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; } 
} 

In meiner Kontext-Datei hatte

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

Antwort

0

ich ein ähnliches Problem und es wurde tatsächlich auf die Migrationsschlüssel lengthrather als der Fremdschlüssel verknüpft.

I durch Modifizierung der Migrationskonfigurationsverfahren gelöst:

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

und dann diese Methode Hinzufügen der Schlüssellängen

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

Ja Peter zu begrenzen, ist das Problem, das Sie erwähnt auch dort. Aber hier war es FK Länge. In diesem Fall, wenn ich auf die frühere Migrationsversion zurückwechsle, konnte EF den FK in der Zwischentabelle in der Datenbank nicht finden. Der Grund dafür ist, dass der Name des FK in der DB anders ist als der, den EF gesucht hat. Wenn ich "PushNotifications" Tabellenname in etwas wie "PN" ändere, ist das Problem weg. – sajith

+0

und Peter für Ihr Problem, folgen Sie dieser, diese Lösung ist unkompliziert. http://stackoverflow.com/a/27082231/443389. Danke, – sajith

+0

Danke, die Lösung, die ich verwendet habe, war zwei über dem hier verlinkten - ich denke, dass Ihr Vorschlag besser aussieht. –

Verwandte Themen