实体框架表之间的多个关系

Ano*_*use 3 linq linq-to-entities entity-framework

我的项目中有两个表,分别是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; }
    }
Run Code Online (Sandbox Code Playgroud)

所以这是很好我有0..1从许多关系UserInvoiceLine.

这意味着Linq我可以获得用户需要检查的InvoiceLines:

user.InvoiceLines
Run Code Online (Sandbox Code Playgroud)

然而,还有另一个要求,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; }
}
Run Code Online (Sandbox Code Playgroud)

所以我真正想要的是:

user.InvoiceLines
Run Code Online (Sandbox Code Playgroud)

并获得CheckersAuditors或可替换地通过让他们seperately:

user.CheckerInvoiceLines
user.AuditorInvoiceLines
Run Code Online (Sandbox Code Playgroud)

user.InvoiceLines虽然这是可以理解的,但我已经无效了.

可能有人请点我就如何正确的方向使用LINQ获得InvoiceLinesUser

编辑更新:

我的模型配置代码如下:

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>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Era*_*nga 7

当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);
    }
Run Code Online (Sandbox Code Playgroud)