1

我的模型看起來像這樣Enitify框架代碼第一:更新實體所需的相關導航性能

public Class Address 
{ 
    public int Id {get;set;} 

    /*Props here*/ 
} 

public Class Person 
{ 
    public int Id {get;set;} 

    public String Name {get;set;} 

    [Required]  
    public Address Address{get;set;} 

    /*More props*/ 
} 

現在假設我已經創建了正確的地址的人,在未來,當我嘗試更新的人這樣

var person= db.Persons.FirstOrDefault(p=>p.Id=1234); 
person.Name="Foo"; 
db.SaveChanges(); 

它給出錯誤說地址是必需的。

因此,爲了避免這種IAM包括地址屬性也同時加載Person實體

var person= db.Persons.Include(p=>p.Address).FirstOrDefault(p=>p.Id=1234); 
person.Name="Foo"; 
db.SaveChanges(); 

有什麼辦法,我可以更新person不包括Address

+0

你的'Address'實體是否有一個指定的主鍵(隱式使用'Id'屬性,或明確地使用'[Key]'屬性)? – KallDrexx

+0

@KallDrexx:是的,更新了我的問題 –

回答

0

如果你想通過EF 4.1自動加載的地址,你必須使地址 - porperty虛:在需要的時候

public virtual Address Address{get;set;} 

EF然後將延遲加載地址。

+0

我知道這一點,我不希望它被延遲加載。我只是不希望它被加載,而更新模型。 –

+0

對不起,不能幫你。您的模型聲明「地址」是必需的屬性。如果你需要繞過這個,也許你應該改變你的模型? –

+0

這絕對可以解決問題,並且比禁用驗證更合乎邏輯。 –

3

這是DbContext的模型驗證,顯然抱怨。所以,一個解決辦法是關閉此驗證:

dbContext.Configuration.ValidateOnSaveEnabled = false; 

另一種選擇是引進國外關鍵屬性:

public class Person 
{ 
    public int Id {get;set;} 
    public String Name {get;set;} 
    public int AddressId {get;set;} 
    public Address Address {get;set;} 

    /*More props*/ 
} 

你可以在這裏省略[Required]屬性,因爲EF將檢測的關係按照公約的要求(由於不可空的FK屬性)。這也適用於啓用驗證。

該行爲有點令人困惑,因爲EF不會將FK列的更改發送到數據庫,所以沒有真正的約束違規並且更新命令執行正常。我猜測驗證只是檢查模型在內存中的狀態(無效,因爲Address爲空),而不是SaveChanges執行(由於FK設置正確而有效)時模型在數據庫中的狀態。

相關問題