2014-10-07 46 views
0

我的用戶是這樣的:在EF中保存數據時,我是否必須包含虛擬屬性?

public class User 
{ 
    public User() 
    { 
     Subscribers = new List<SubscriberNumber>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string Username { get; set; } 

    [Required] 
    public virtual BusinessNumber BusinessNumber { get; set; } 
    public string BusinessName { get; set; } 
    public int SubscriberCount { get; set; } 

    public List<SubscriberNumber> Subscribers { get; set; } 
} 

以下調用失敗,因爲一些未公開的EntityValidationError:

var user = db.Users.First(s => s.Username == username); 
user.BusinessName = "test"; 
db.SaveChanges(); 

但在VS無論是開放user.BusinessNumber或使用下列內容:

var user = db.Users.Include(s => s.BusinessNumber).First(s => s.Username == username); 

得到SaveChanges()工作。當我更新我的用戶時,是否總是必須包含虛擬屬性?這似乎很麻煩......

+0

您將'BusinessNumber'設置爲'[必需]',因此您必須爲其設置一個值。 – Masoud 2014-10-07 03:57:15

回答

0

屬性上的虛擬允許EF構建代理。使用EF的常規屬性來讀取和寫入數據並不是必需的。但是,導航屬性上需要Virtual。 默認Context.Configuration.ValidateOnSaveEnabled = true;
EF將在SaveChanges()上觸發驗證。

所以在導航屬性是必需的(爲什麼?)的例子中,您必須首先在上下文和POCO中填充它。將[required]放置在外鍵屬性而不是導航屬性上更爲常見。

public class User 
{ 
public User() 
{ 
    Subscribers = new List<SubscriberNumber>(); 
} 

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int UserId { get; set; } 
public string Username { get; set; } 

[Required] 
public virtual int BusinessId {get;set;}; // make the foreign key to BusinessNumber required if necessary 

[ForeignKey("BusinessId")] 
public virtual BusinessNumber BusinessNumber { get; set; } // this is a nav prop, since it isnt a simple base type 

public string BusinessName { get; set; } 
public int SubscriberCount { get; set; } 

public List<SubscriberNumber> Subscribers { get; set; } 
} 
相關問題