簡體   English   中英

EF6:多對多關系返回空集合

[英]EF6: Many-to-many relationship returning empty collections

在過去的3個小時中,我一直在努力弄清楚這一點,並且我肯定會漏掉一些非常明顯的東西...

這是模型代碼:

[Table("company")]
public partial class company
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public company()
    {
        job = new HashSet<job>();
        contact = new HashSet<contact>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int companyId { get; set; }

    [Required]
    [StringLength(255)]
    public string name { get; set; }

    [StringLength(255)]
    public string address { get; set; }

    [StringLength(255)]
    public string locality { get; set; }

    [StringLength(255)]
    public string city { get; set; }

    [StringLength(100)]
    public string state { get; set; }

    [StringLength(16)]
    public string postalCode { get; set; }

    [StringLength(2)]
    public string country { get; set; }

    [StringLength(16)]
    public string phone { get; set; }

    [StringLength(63)]
    public string email { get; set; }

    [StringLength(127)]
    public string website { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<job> job { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<contact> contact { get; set; }
}

[Table("contact")]
public partial class contact
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public contact()
    {
        this.company = new HashSet<company>();
    }
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int contactId { get; set; }

    [Required]
    [StringLength(64)]
    public string firstName { get; set; }

    [Required]
    [StringLength(64)]
    public string lastName { get; set; }

    [StringLength(1)]
    public string middleInitial { get; set; }

    public string title { get; set; }

    [StringLength(18)]
    public string phoneNumber { get; set; }

    [StringLength(128)]
    public string emailAddress { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<company> company { get; set; }
}

[Table("job")]
public class job
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public job()
    {
        company = new HashSet<company>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int jobId { get; set; }

    public string jobTitle { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<company> company { get; set; }

}

OnModelCreating我有這個:

modelBuilder.Entity<company>()
    .HasMany(e => e.job)
    .WithMany(e => e.company)
    .Map(m => m.ToTable("company_job", "dbo").MapLeftKey("companyId").MapRightKey("jobId"));

modelBuilder.Entity<company>()
    .HasMany(e => e.contact)
    .WithMany(e => e.company)
    .Map(m => m.ToTable("company_contact", "dbo").MapLeftKey("companyId").MapRightKey("contactId"));

我已經在數據庫端檢查了以下所有內容:

  • 所有這三個主表都存在並且與模型列對應。
  • 存在與橋表的所有外鍵關系。
  • 兩個橋表都有一個由兩列組成的復合主鍵。
  • 兩個橋表都被命名為與Map方法參數匹配,橋表中的列也是如此。
  • 該數據庫具有適當的數據,這些數據應導致jobcontact實體出現在所有company實體下。
  • 手動寫入數據庫查詢確實可以成功生成預期數據。

然而:

ctx.company.Where(x => x.companyId == 300).job.Count()

始終返回0 試:

ctx.company.Where(x => x.companyId == 300).job.FirstOrDefault()

返回null

我嘗試在上下文上設置日志記錄:

Database.Log = msg => System.Diagnostics.Debug.WriteLine(msg);

而且我注意到,曾經發送到數據庫的唯一查詢是針對company表的。 它不執行聯接查詢。 它甚至都不會碰到job表, contact表或橋表。 它只是使用正確的WHERE子句對company表進行單個查詢,但WHERE再也沒有進行。

只是為了踢一下,我試圖反轉.Map調用中字段的順序,但這沒有任何效果。 (換句話說: .Map(m => m.ToTable("company_job", "dbo").MapLeftKey("jobId").MapRightKey("companyId"))並未更改。)

好吧,我想念什么?

ACK ...

在上下文構造函數中是這樣的:

base.Configuration.ProxyCreationEnabled = false;

我刪除了它,現在好像可以了!

(我繼承了此代碼,因此這里的教訓是:永遠不要假設您繼承的代碼確實執行了認為會做的事!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM