簡體   English   中英

EF6.1.2代碼首先具有2個導航屬性,兩者都是一對一的關系,一個起作用,但是另一個不起作用

[英]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.

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