先用EF代码保存虚拟机属性
本文关键字:虚拟机 属性 保存 代码 EF 先用 | 更新日期: 2023-09-27 18:07:51
我认为这将是简单的,但找不到任何好的例子。
public Class BookVm : ImplementsPropertyChanged
{
public int BookId {get;set;}
private bool _favorite;
public bool Favorite
{
get { return _favorite; }
set {
_favorite = value;
OnPropertyChanged("Favorite");
MyDbContext.SaveChanges() // this does not work
}
}
然后在我的XAML绑定到Book
<CheckBox Content="Favorite" IsChecked="{Binding Favorite}" />
我如何以及何时在我的DatabaseContext上调用SaveChanges() ?
我不想实现保存按钮。如果拦截PropertyChange事件并调用SaveChanges,似乎什么也不会发生。我的对象在内存中被修改了,但是数据库没有看到任何变化。
我的BookVm
类是在应用程序启动时创建的,像这样:
foreach (var book in MyDbContext.Books)
Books.Add(book);
其中Books
是MainWindowVm
中的ObservableCollection<Book>
假设你有一个数据服务类,它返回book并更新book:
public class DataService
{
public static void UpdateBook(Book book)
{
//Call the context to update the database
}
public static IEnumerable<Book> FetchBooks()
{
// return DBContext.GetBooks
}
}
现在你可以创建一个视图模型,它接受一本书,然后返回属性。BookId不会随着数据库的不同而改变(如果它是主键)。
//Domain Object
public class Book
{
public int BookId { get; set; }
public bool Favourite { get; set; }
}
//View Model
public class BookVm : ImplementsPropertyChanged
{
private readonly Book book;
//Store the book
public BookVm(Book book)
{
this.book = book;
}
private bool favorite;
public int BookId
{
get { return book.BookId; }
}
public bool Favorite
{
get { return favorite; }
set
{
if (favorite != value)
{
favorite = value;
//Update the database
UpdateDatabase();
}
}
}
private void UpdateDatabase()
{
//set the favorite value of the domain book
book.Favourite = favorite;
DataService.UpdateBook(book);
}
}
我们将域对象存储在ViewModel中供以后的用户使用。我们还可以编写这样一个控制器来显示视图:
public class BookController
{
public void Display()
{
IEnumerable<Book> books = DataService.FetchBooks();
ObservableCollection<BookVm> bookVms = new ObservableCollection<BookVm>();
foreach (var book in books)
{
BookVm bookVm = new BookVm(book);
bookVms.Add(bookVm);
}
//Get the View and then bind using the bookVms collection
}
}
如果您想保存属性Favorite
的更改,您必须订阅属性更改事件,然后将值保存到DB。
您可以在这里找到一个链接,其中包含有关订阅属性更改事件的信息
编辑下面是来自MSDN
还猜测在Implements属性更改中有类似的代码。
public class ImplementsPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
您还需要添加以下内容来触发通知。
public bool Favorite
{
get { return favorite; }
set
{
if (favorite != value)
{
favorite = value;
//Update the database
UpdateDatabase();
OnPropertyChanged("Favorite");
}
}
}