![](/img/trans.png)
[英]DynamicData with EF6.1.2 does not work because of namespace changes
[英]EF6.1.2 code first with 2 navigation properties both are one to zero to one, one works, but the other does not work
我有3張桌子,一張是基本桌子,很大。 然后我有一個擴展表,它也很大。然后我有一個只有一個屬性的小表,除了PK
本質上,除了第一個表的名稱外,所有3個表的主鍵都是相同的:
[Table("KLANTEN")]
public class Klant
{
public Klant()
{
this.ContactPersonen = new HashSet<ContactPersoon>();
this.Afleveringen = new HashSet<Aflever>();
}
[Key]
[StringLength(8000)]
public string NUMMER { get; set; }
.... removed for brevity
#region Navigation Properties
public virtual Aanspreking Aanspreking { get; set; }
public virtual PuntenKlant PuntenKlant { get; set; } // fail
public virtual ExtraVeldenKlant ExtraVeldenKlant { get; set; } //ok
public virtual ICollection<ContactPersoon> ContactPersonen { get; set; }
public virtual ICollection<Aflever> Afleveringen { get; set; }
#endregion
}
第二張表:
[Table("EXVKLA")]
public class ExtraVeldenKlant
{
[Key]
[StringLength(8000)]
public string NUMMER { get; set; }
... removed for brevity
#region Navigation Properties
public virtual Klant Klant { get; set; }
#endregion
}
第三張表:
[Table("[_CTPUNT]")]
public class PuntenKlant
{
[Key]
[StringLength(8000)]
public string KODE { get; set; }
[StringLength(8000)]
public string OMSCHR { get; set; }
#region Navigation Properties
public virtual Klant Klant { get; set; }
#endregion
}
如您所見,密鑰始終在第一列上定義,而不使用流暢的api。 我喜歡這種方式和理解方式,可以將流利的api和屬性語法混合使用,對嗎?
所以對於配置我正在這樣做:
class KlantConfiguration : EntityTypeConfiguration<Klant>
{
public KlantConfiguration()
{
.... removed for brevity
this.HasMany(e => e.ContactPersonen)
.WithRequired(e => e.Klant)
.HasForeignKey(e => e.KLANTCODE)
.WillCascadeOnDelete(false);
this.HasMany(e => e.Afleveringen)
.WithRequired(e => e.Klant)
.HasForeignKey(e => e.KLANTCODE)
.WillCascadeOnDelete(false);
this.HasOptional(e => e.PuntenKlant)
.WithRequired(f => f.Klant);
this.HasOptional(e => e.ExtraVeldenKlant)
.WithRequired(e => e.Klant);
}
}
執行以下SQL語句只是為了驗證一切是否就緒:
select klanten.nummer,P.KODE,E.NUMMER,p.OMSCHR from klanten
inner join "_CTPUNT" P on P.KODE=klanten.nummer
inner join exvkla E on E.NUMMER=klanten.nummer
where klanten.nummer='000002'
結果是 :
NUMMER KODE NUMMER OMSCHR
======== ====== ======== ========================================
000002 000002 000002 571
因此證明這三個表中都存在密鑰
現在,如果我使用EF中的實際內容嘗試此操作:
var puntenquery =
from p in repoKlant.Queryable().Include("PuntenKlant").Include("ExtraVeldenKlant")
where p.NUMMER == "000002"
select p;
然后我得到了奇怪的結果,導航屬性PuntenKlant為null,但是導航屬性ExtraVeldenKlant已正確填寫。我看不到我要去哪里了。 調試EF顯示該查詢實際上已正確執行,但是它相當大,但是該特定導航屬性中的字段是EF生成的查詢的整數。 盡管看起來似乎在物化過程中不起作用。
我在做什么錯或者EF或普及的ADO.NET驅動程序中有錯誤,這不是SQL Server
好的,看來我必須稍微更改基礎數據庫。 其中一張表中的關鍵字段長度較短。 老兄,我今天很難解決這個上班族的問題。
並且此鏈接是完美的解決方案: 如何配置實體框架以自動修剪為映射到char(N)字段的特定列檢索的值?
因此,我不必更改數據庫中的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.