1

J'utilise la première approche de code Entity Framework 4 pour concevoir ma base de données dans ASP MVC 3 et j'ai rencontré un peu d'accroc . J'ai une classe POCO comme ci-dessous:Relations un-à-un plus plusieurs-à-plusieurs avec le même objet ne pas construire correctement

public class User 
{ 
    [Key] 
    public Guid UserID { get; set; } 
    public string UserName { get; set; } 
    public DateTime CreationDate { get; set; } 
    public string Email { get; set; } 
    public int Points { get; set; } 
    public Session ActiveSession { get; set; } 
    public ICollection<Session> InSessions { get; set; } 
} 

avec Session comme un autre de mes classes de modèle définies ailleurs, avec ICollection<User> comme une de ses propriétés. Si je supprime la propriété public Session ActiveSession { get; set; } de la classe User, le mappage plusieurs-à-plusieurs et la table intermédiaire UserSessions sont construits correctement, mais lorsque j'ajoute le mappage unidirectionnel ActiveSession, il casse le plusieurs-à-plusieurs le mappage et la table intermédiaire n'est pas construite. Au lieu de cela, la table Users comporte une clé étrangère unique pour le tableau Sessions, chacune pour les propriétés ActiveSession et InSessions. Des idées pour lesquelles cela se passe?

+0

peut vous montrer votre code de mappage? – Eranga

+0

@Eranga Ce qui précède est à peu près tout. J'utilise la première approche du code, donc je n'ai pas de modèle edmx, et jusqu'à présent, je n'ai pas eu besoin d'utiliser l'API ou les attributs fluides de mappage. EF construit ma base de données pour moi, donc je n'ai pas besoin de mapper les tables existantes. – Kongress

Répondre

3

Dans votre cas EF pense que ICollection<User> dans Session classe est la fin Many de la relation un à plusieurs créé par ActiveSession.

Vous devez configurer mannualy

modelBuilder.Entity<User>().HasOptional(u => u.ActiveSession) 
    .WithMany() 
    .Map(u => u.MapKey("ForeignKeyColumn")); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.InSessions) 
    .WithMany(s => s.Users) 
    .Map(m => 
     { 
      m.ToTable("UserSessions"); 
      m.MapLeftKey("UserID"); 
      m.MapRightKey("SessionID"); 
     }); 
Questions connexes