EF Code First - две таблицы, две взаимосвязи - PullRequest
1 голос
/ 16 июня 2011

У меня проблемы;

Для начала представьте, что у нас есть член организации, а у участника есть проекты.

Если вы спросите: есть ли в проектах участники? Да, они имеют ...

Участники (N *) <-> Проект (N *) - так же, как и n-n-отношения.

Но в моем доменном приложении я также хочу сказать, что один участник отвечает за N проектов, а один проект имеет одного участника.

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

Для свойства ProjectsWorker в Worker отношения N-N между Участником и Проектом будут иметь отношение N-N, но при этом (среда EF создает для меня только одностороннюю связь)

У меня вопрос ... кто может сопоставить эти два отношения с первым кодом? Я использовал DatabaseFirst, и теперь с первым кодом он кажется очень мощным, но немного ограничивает меня.

1 Ответ

1 голос
/ 16 июня 2011

Вы должны сказать EF, какие отношения принадлежат друг другу. Вы можете сделать это либо с аннотациями данных ...

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; }
    // ...
}

(Я считаю, что атрибут InverseProperty необходим только на одной стороне отношений, но я не уверен.)

... или в свободном 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");
        });
}
...