[英]CurrentValues.SetValues doest not raise INotifyPropertyChanged
我正在我的 EF POCO 上實現INotifyPropertyChanged
接口。
我有一個 function 來重置更改:
var entry = db.Entry(c);
entry.CurrentValues.SetValues(entry.OriginalValues);
但它不調用INotifyPropertyChanged
。 它根本不調用 setter。
也許有更好的方法來重置實體?
我正在我的 EF POCO 上實現 INotifyPropertyChanged 接口。
這意味着您使用實體類作為視圖模型。 從該設計決策可以推測,為了防止保存更改,當用戶取消編輯時必須重置實體。
但它不調用 INotifyPropertyChanged。
您注意到未調用 setter 可能意味着 UI 元素也必須收到有關此重置的通知。
現在你可以做兩件事:修復設置器的繞過,或者修復設計。
EF 核心繞過設置器,因為默認情況下它會嘗試使用支持字段。 阻止 EF 這樣做很容易。 您可以打破 EF 遵循的命名約定,或者告訴它不要完全查看它。 EF 不會在這樣的代碼中找到支持字段:
private string _titleField;
public string Title
{
get { return _titleField; }
set
{
_titleField = value;
// notification code
}
}
但從代碼本身來看,為什么該字段有如此奇怪的名稱並不明顯。 它很容易被遺忘。
如果您希望 EF 使用設置器,則應顯式配置它:
modelBuilder.Entity<Post>().Property(p => p.Title)
.UsePropertyAccessMode(PropertyAccessMode.PreferProperty);
但這也意味着當 EF 實現實體 object 時將發送更改通知。 (但在那一刻可能還沒有人聽)。
IMO,改變設計會更好。 在 UI 中使用視圖 model class(帶有INotifyPropertyChanged
)僅在確認保存時將其更改傳輸到基礎實體 class。 現在,如果用戶取消更改,您只需丟棄(或使用通知重置)視圖 model 即可完成。 永遠不需要“重置實體”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.