先用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);

其中BooksMainWindowVm中的ObservableCollection<Book>

先用EF代码保存虚拟机属性

假设你有一个数据服务类,它返回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");
            }
        }
    }