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

时间:2011-08-31 03:37:38

标签: linq entity-framework linq-to-entities

我的项目中有两个表,分别是User和InvoiceLine。

已指定InvoiceLine可以将User称为检查程序。

我的模特是:

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

所以这很好我从UserInvoiceLine有一个0..1到多个关系。

这意味着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

并获取CheckersAuditors,或者通过以下方式单独获取:

user.CheckerInvoiceLines
user.AuditorInvoiceLines

虽然这是可以理解的,但我从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 个答案:

答案 0 :(得分: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);
    }