2015-06-19 23 views
1

我正在使用PC配置器應用程序,並且驗證有問題。應用程序的一點是要檢查主板上的插槽是一樣的CPU插座等實體框架驗證上下文 - null null測試中的異常

我做的代碼第一個數據庫使用Visual Studio 2013年的腳手架

public class Configuration : IValidatableObject 
{ 
    [Key] 
    public int ConfigurationID { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 3)] 
    [DisplayName("Configuration name")] 
    public string ConfigName { get; set; } 

    [ForeignKey("mb_id")] 
    public MotherBoard MotherBoard { get; set; } 

    [Column("mb_id", TypeName = "int")] 
    public Nullable<int> mb_id { get; set; } 

    [ForeignKey("cpu_id")] 
    public CPU CPU { get; set; } 

    [Column("cpu_id", TypeName = "int")] 
    public Nullable<int> cpu_id { get; set; } 
} 

這是在配置模型的一部分,我正在使用(其餘的看起來非常相似 - 只是其他組件)

我只是把這個模型腳手架控制器。

這是驗證的開始,它似乎是問題在這裏的某處(至少VS是這麼說的)。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (MotherBoard == null) { throw new ArgumentNullException("Motherboard"); } 
    if (CPU == null) { throw new ArgumentNullException("CPU"); } 
    if (GPU == null) { throw new ArgumentNullException("GPU"); } 
    if (HDD == null) { throw new ArgumentNullException("HDD"); } 
    if (RAM == null) { throw new ArgumentNullException("RAM"); } 
    if (Power == null) { throw new ArgumentNullException("Power"); } 
    if (Case == null) { throw new ArgumentNullException("Case"); } 

    if (MotherBoard.CPU.ToUpper().Trim() != CPU.Socket.ToUpper().Trim()) 
    { 
      yield return new ValidationResult("CPU socket does not match.", new[] { "cpu_id" }); 
    } 
} 

當我創建沒有驗證的PC配置時,它通常會進入數據庫。但是,當我嘗試驗證它說,CPU(在空測試)爲空,並拋出空異常。 Screenshot from VS.

它永遠不會拋出它在主板上,但總是在下一個項目(第二項)。

+0

您是否檢查CPU中的張貼值?它真的爲空,或者它拋出的異常不爲空 –

+0

它實際上表現得很奇怪。當我將驗證放入評論中時,它通常會將配置放入數據庫中。但是當我取消註釋時,它表示主板爲空,但在CPU空測試中引發異常。 – healadin

+0

我的意思是當我運行這個沒有驗證實現時,它創建配置與CPU和一切都沒有問題。 – healadin

回答

0

CPU似乎被實體框架視爲navigation property。如果沒有更多的信息,這意味着你將需要:

在任何
  1. using System.Data.Entity單元從數據庫中枚舉查詢

如果這是一個真正的navigation property之前將模型

  • .Include(c => c.CPU),因爲它出現時,它可能是lazily loaded,如實體框架材料中所述。

    這意味着即使這些值似乎存在於數據庫中,實際的集合 - 或者在您的情況下,引用 - 在內存中將爲空。所以我們講實體框架「包括」這些項目時,我們取:

    var configuration = db.ConfigurationsOrSomething 
        .Include(c => c.CPU) 
        .Where(c => c.DeletedOrWhatever == false) 
        .ToList(); 
    
    var cpu = configuration.CPU; 
    
    if(cpu == null) 
        Debug.WriteLine("Something else is the problem. :("); 
    

    你曾經說過,你見過在數據庫中的值。我們看不到你用來從數據庫中選擇實體的代碼 - 或者其他任何東西,如果還有其他東西的話。我們也可以可以看到CPU是你定義和引用的另一種類型。如果您需要了解更多關於它的信息,請參閱EF Code First/Table-per-Type

    注意:我已經重新閱讀了您的評論。當你被問到它是否進入數據庫時​​,你同意它在沒有驗證的情況下「正常創建」。

    我現在正在考慮您的整個設置是一個簡單的驗證失敗。如果驗證表明CPU爲空......則CPU爲空。

    那麼:你使用的代碼在哪裏創建這個Configuration實體的新實例?你只是沒有給CPU分配一個值?

  • +0

    你能解釋第二步多一點嗎?我會張貼整個項目,如果我可以... – healadin

    +0

    謝謝它真的很懶惰加載 – healadin