3

Je m'étais investi un jour pour trouver une solution sans succès. J'aime créer une relation simple de plusieurs à plusieurs.Plusieurs-à-plusieurs Relations avec 'code first' dans Entity Framework 5 (EF5 - version finale) avec VS2012

Pour que j'ai créé deux modèles:

Une classe du joueur où je vais avoir la propriété de navigation « Turnaments » pour voir ce qui a turnaments visiter un joueur.

public class Player 
{ 
    [Key] 
    public Int64 PlayerId { get; set; } 

    public string FirstName { get; set; } 

    [Required] 
    public string Surename { get; set; } 

    public virtual ICollection<Turnament> Turnaments { get; set; } 
} 

et une classe Turnament où j'aurai la propriété de navigation 'Players' pour voir quels joueurs font partie du turnament.

public class Turnament 
{ 
    [Key] 
    public int TurnamentId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public DateTime? StartDate { get; set; } 

    public DateTime? EndDate { get; set; } 

    public bool IsClosed { get; set; } 

    public virtual ICollection<Player> Players { get; set; } 
} 

Si démarrer le mirgation de la commande 'de base de données Upate-' (Automtic migratons = on) à la fenêtre 'Package Manager Console' de VS2012 - Je reçois l'exception suivante:

Présentation FOREIGN KEY La contrainte 'FK_dbo.PlayerTurnaments_dbo.Turnaments_Turnament_TurnamentId' sur la table 'PlayerTurnaments' peut provoquer des cycles ou plusieurs chemins en cascade. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifiez d'autres contraintes FOREIGN KEY. Impossible de créer une contrainte. Voir les erreurs précédentes.

Aussi l'arrière-plan de cette exception je comprends.

Je vais donc atteindre à dire l'entité framwork que si je suis supprimer:

a) Un joueur EF ne doit pas pousser une suppression en cascade à l'Turnament associée

b) Un Turnament EF devrait Pousser une cascade supprimer au lecteur associé

avec cet arrière-plan les chemins de cycles ont disparu.

J'étais donc essayer de mettre en œuvre une « cascade de commutateurs supprimer off » via l'API couramment de l'entité Framwork:

public class DataContext : DbContext 
{ 
    public DbSet<Turnament> Turnaments { get; set; } 
    public DbSet<Player> Players { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     //modelBuilder.Entity<Turnament>() 
     // .HasMany(b => b.Players) 
     // .WithMany(a => a.Turnaments) 
     // .Map(m => m.MapLeftKey("PlayerPid") 
     //     .MapRightKey("TurnamentPid") 
     //     .ToTable("TurnamentsJoinPlayers")); 


     //modelBuilder.Entity<Player>().HasRequired(t => t.Turnaments). 
     // WithMany().WillCascadeOnDelete(false); 

     //modelBuilder.Entity<Turnament>().HasRequired(t => t.Players). 
     // WithMany().WillCascadeOnDelete(false); 

     //modelBuilder.Entity<Player>().HasRequired(t => t.TurnamentsRelation). 
     // WithMany().HasForeignKey(p => p.PlayerId).WillCascadeOnDelete(false); 

     //modelBuilder.Entity<Player>().HasMany(p => p.TurnamentsRelation). 

     base.OnModelCreating(modelBuilder); 

    } 
} 

Mais comme vous le voyez everthing est parce que son remets ne vous aide pas.

thx pour toute l'aide compétente plus que seulement un code snippes que seules les fissures comprennent :) PS: Je suis sûr qu'il ya une solution pour EF5 (final) de ce genre d'un grand nombre à plusieurs relations

+0

Quel a été le modèle comme avant la migration? –

+0

Avez-vous seulement ces deux entités dans le modèle? Le message d'exception peut être trompeur. –

+0

@GertArnold: Avant les propriétés de navigation 'Turnaments' et 'Players' n'existent pas. Ainsi, la migration initiale a créé la base de données avec les deux tables. –

Répondre

2

SOLUTION

public class MyAppContext : DbContext 
{ 

    public MyAppContext() 
    { 
    // Somtimes helps to uncommend that line, then the Database will recreated! 
    // (For people that are not fit enough in EF CodeFirst - like me ;) 
    // 1) Uncommend 
    // 2) Start Application go on a site that access your data wait for 
    // Exception (No Database!) 
    // 3) Unkommend line 
    // 4) Execute 'update-database' at the 'Package Manager Console' of VS 2012 
    // Database.SetInitializer(new DropCreateDatabaseAlways<LivescoreContext>()); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     /* Players <-> Turnaments */ 
     modelBuilder.Entity<Player>() 
      .HasMany(p => p.Turnaments) 
      .WithMany(p => p.Players) 
      .Map(mc => 
       { 
        mc.MapLeftKey("PlayerPid"); 
        mc.MapRightKey("TurnamentPid"); 
        mc.ToTable("PlayersJoinTurnaments"); 
       }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
Questions connexes