[英]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
方法參數匹配,橋表中的列也是如此。 job
和contact
實體出現在所有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.