Entity Framework множественные отношения между таблицами - PullRequest
3 голосов
/ 31 августа 2011

В моем проекте есть две таблицы: User и InvoiceLine.

Было указано, что InvoiceLine может иметь User, известный как Checker.

Мои модели:

public class InvoiceLine : IEntity
    {
        public virtual int Id { get; set; }
        public virtual int? CheckerId { get; set; }
        public virtual string CreatedByUserName { get; set; }
        public virtual DateTime CreatedDateTime { get; set; }
        public virtual string LastModifiedByUserName { get; set; }
        public virtual DateTime? LastModifiedDateTime { get; set; }

        // Navigation properties
        public virtual User Checker{ get; set; }
}



public class User : IEntity
    {
        public int Id { get; set; }
        public string CreatedByUserName { get; set; }
        public DateTime CreatedDateTime { get; set; }
        public string LastModifiedByUserName { get; set; }
        public DateTime? LastModifiedDateTime { get; set; }

        //Navigation properties
        public virtual ICollection<InvoiceLine> InvoiceLines { get; set; }
    }

Так что все в порядке, у меня есть отношение от 0 до 1 ко многим от User до InvoiceLine.

Это означало, что с Linq я мог получитьInvoiceLines, которые пользователь должен проверить:

user.InvoiceLines

Однако есть еще одно требование, чтобы InvoiceLine также имел Auditor, поэтому я изменил InvoiceLine на:

public class InvoiceLine : IEntity
    {
        public virtual int Id { get; set; }
        public virtual int? CheckerId { get; set; }
        public virtual int? AuditorId { get; set; }
        public virtual string CreatedByUserName { get; set; }
        public virtual DateTime CreatedDateTime { get; set; }
        public virtual string LastModifiedByUserName { get; set; }
        public virtual DateTime? LastModifiedDateTime { get; set; }

        // Navigation properties}
        public virtual User Checker { get; set; }
        public virtual User Auditor { get; set; }
}

Так что я действительно хотел пойти:

user.InvoiceLines

и получить Checkers и Auditors или, альтернативно, получить их отдельно через:

user.CheckerInvoiceLines
user.AuditorInvoiceLines

Я получаюnull назад от user.InvoiceLines, хотя это и понятно.

Может ли кто-нибудь указать мне правильное направление о том, как использовать Linq для получения InvoiceLines от User?

Редактировать обновление:

Код конфигурации моей модели такой:

public class VectorCheckContext : DbContext
    {
        ...

        public DbSet<InvoiceLine> InvoiceLines { get; set; }
        public DbSet<User> Users { get; set; }

        ...

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        }
    }

1 Ответ

7 голосов
/ 31 августа 2011

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

        //other mappings

        modelBuilder.Entity<InvoiceLine>()
           .HasOptional(i => i.Checker)
           .WithMany(u => u.CheckerInvoiceLines)
           .HasForeignKey(i => i.CheckerId);

        modelBuilder.Entity<InvoiceLine>()
           .HasOptional(i => i.Auditor)
           .WithMany(u => u.AuditorInvoiceLines)
           .HasForeignKey(i => i.AuditorId);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...