2011-06-16 4 views
1

Je suis avec un problème;EF Code First - Deux tables, deux relations

Pour imaginer initiale que nous avons une entité membre, et membre a des projets ..

Si vous demandez: Est-ce projets sont membres? Oui, ils ont ...

Membres (N *) < -> Projet (N *) - ainsi est une relation n-n.

Mais dans mon application domaine que je veux dire aussi que un membre est responsable des projets N, et un projet a un membre ..

public class Member : User 
{ 
    public virtual ICollection<Project> ProjectsResponsable { get; set; } 
    public virtual ICollection<Project> ProjectsWorker { get; set; } 
} 
public class Project 
{ 
    public virtual int ProjectID { get; set; } 
    public virtual String Name { get; set; } 
    public virtual bool Enabled { get; set; } 
    public virtual DateTime CreatedDate { get; set; } 
    public virtual String Description { get; set; } 

    public virtual Member Responsable { get; set; } 
    public virtual ICollection<Member> Workers { get; set; } 
    public virtual ICollection<Issue> Issues { get; set; } 
} 

Pour les biens ProjectsWorker Worker sera une relation NN entre membres et Projet, mais avec ceci (le cadre EF crée seulement pour moi la relashionship 1-way)

Ma question est ... qui peut mapper ces deux relations avec le code d'abord. J'utilisais DatabaseFirst, et maintenant, avec le code-first, il semble être très puissant mais il me limite un peu maintenant.

+1

Quelle est votre question? Cherchez-vous à n'avoir qu'un seul membre par projet, mais laissez les membres avoir un nombre de projets? –

Répondre

1

Vous devez indiquer à EF quelles relations sont liées. Vous pouvez le faire soit avec annotations de données ...

public class Member : User 
{ 
    [InverseProperty("Responsable")] 
    public virtual ICollection<Project> ProjectsResponsable { get; set; } 
    [InverseProperty("Workers")] 
    public virtual ICollection<Project> ProjectsWorker { get; set; } 
} 

public class Project 
{ 
    public virtual int ProjectID { get; set; } 
    // ... 
    [InverseProperty("ProjectsResponsable")] 
    public virtual Member Responsable { get; set; } 
    [InverseProperty("ProjectsWorker")] 
    public virtual ICollection<Member> Workers { get; set; } 
    // ... 
} 

(je crois que l'attribut InverseProperty est nécessaire uniquement sur un côté de la relation, mais je ne suis pas sûr.)

... ou Fluent API:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>() 
     .HasMany(m => m.ProjectsResponsable) 
     .WithOptional(p => p.Responsable) // or WithRequired(...) 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Member>() 
     .HasMany(m => m.ProjectsWorker) 
     .WithMany(p => p.Workers) 
     .Map(a => { 
      a.ToTable("MemberProjects"); 
      a.MapLeftKey("MemberID"); 
      a.MapRightKey("ProjectID"); 
     }); 
} 
+0

Merci Slauma est vraiment ce dont j'ai besoin, merci pour votre temps :) – anotherNeo

+0

@Slauma Je pense que vous êtes la bonne personne pour m'aider avec le suivre: Comme vous pouvez le voir, le membre s'étend de l'utilisateur ... et j'en ai un de plus Entité: Client qui s'étend aussi, donc mon schéma aura 3 tables, Utilisateur, Membre et Client. J'ai besoin d'avoir une relation de plus entre le projet et le client, c'est-à-dire un projet et un client a n projets. Regardez le message suivant pour voir ce que je suis dans FluentAPI – anotherNeo

+0

modelBuilder.Entity () . HasMany (c => c.Projects) .WithRequired (p => p.Client) .WillCascadeOnDelete (false); – anotherNeo

Questions connexes