2016-04-13 222 views
1

我在EF真正的新,我suddenyl卡住了一個問題:實體框架列 - 實體關聯?

 var _entity = new TestEntity(); 

     _entity.Customers.Add(new Customers { Description = "John" }); 
     _entity.Customers.Add(new Customers { Customer_ID = 1, Description = "Steve" }); 

     try 
     { 
      _entity.SaveChanges(); 
     } 
     catch (System.Data.Entity.Validation.DbEntityValidationException) 
     { 
      Debug.Print("Validation Error"); 
     } 

運行此代碼後,我有這insterted兩個記錄沒有任何異常的結果,但我的問題是Customer_ID字段不允許爲null或定義任何默認值。然而,「約翰」 -record已插入CUSTOMER_ID:0 (當然,「史蒂夫」也-Record,用正確的ID:1)

如何管理拋出厚望,或至少在插入值之前驗證更深入,如果沒有通過代碼定義,請遠離插入?

模型類是在這裏:

[Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Customer_ID { get; set; } 

    [Column(Order = 1)] 
    [StringLength(50)] 
    public string Description { get; set; } 

謝謝

回答

1

的默認值int是0,這是不是null,你可以把它插入到數據庫。如果您想檢查Customer_ID是否分配給大於0的值,您可以嘗試Range屬性。

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Range(1, Int32.MaxValue, ErrorMessage = "Value for {0} must be larger than 0.")] 
public int Customer_ID { get; set; } 

另一個醜陋的解決方案可能會被標記更改屬性類型int?和應用Required屬性是這樣的:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Required] 
public int? Customer_ID { get; set; } 
+0

@GertArnold感謝您的糾正 –

-1

,如果你想爲CUSTOMER_ID接受空或不是目前尚不清楚? public int Customer_ID {get;組; }的默認值爲0,所以你得到的是正確的。

如果需要嘗試:

[Required] 
public int Customer_ID { get; set; } 

,如果它可以爲null

public int? Customer_ID { get; set; } 
+0

好的,在SQL方面的表定義中,Customer_ID不允許爲null。在我的代碼中,我沒有定義John記錄的值,所以這意味着 - 從我的角度來看 - 我沒有給Customer_ID賦值,所以默認情況下它應該爲空,並獲得一個異常,即注意,你沒有定義ID的值。 – user1692315

+1

那麼在C#中,你有一個屬性類型爲int的Customer_ID,這意味着Customer_ID的默認值是0.所以換句話說,如果你想在db中看到NULL,你必須有一個可爲空的類型作爲propery ex:public int? Customer_ID {get;組; }。然後新行將會爲空。 – Catalin

+0

你必須在此之後添加一個新行才能看到它工作。 – Catalin

1

好吧,我知道了。

所以我應該簽署的價值爲可爲空:

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int? Customer_ID { get; set; } 

在這種情況下,我剛剛拿到了一個DbUpdateException。也許是一個解決方案,但也許不是最好的,所以其他建議仍然受歡迎。

+1

這就是我所做的。 –

1

在數據庫方面,我強烈建議在Customer_ID上放置一個CHECK約束,使其不允許爲0.這樣可以防止應用程序中的錯誤泄漏到數據庫中。