如何在winform应用程序中正确使用DBContext / EF?

时间:2017-07-17 16:40:56

标签: c# winforms entity-framework dbcontext

在winforms应用程序中没有太多关于EF的信息。在his msdn page上,我们发现:

  

使用Windows Presentation Foundation(WPF)或Windows时   表单,使用每个表单的上下文实例。这可以让你使用   上下文提供的更改跟踪功能。

所以我认为我不应该使用:

using (var context = new MyAppContext()) 
{     
    // Perform operations 
}

但是我应该在每个表单的加载时创建一个新的MyAppContext,并在表单关闭时释放它(并且可选地SaveChange()之前)。

是否正确?

如果是,我如何在运行时更改我的整个应用程序的数据库?

1 个答案:

答案 0 :(得分:1)

我相信对于您需要包含的任何模型,您需要每个表单的上下文实例。这是我刚刚在WPF表单后面的课程(Entity Framework in Depth: The Complete Guide)的表单背后的代码。我希望这有帮助!

using PlutoDesktop.Core.Domain;
using PlutoDesktop.Persistence;
using System;
using System.Data.Entity;
using System.Windows;

namespace PlutoDesktop
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private PlutoContext _context = new PlutoContext();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            System.Windows.Data.CollectionViewSource courseViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("courseViewSource")));

            _context.Courses.Include(c => c.Author).Load();

            courseViewSource.Source = _context.Courses.Local;
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            base.OnClosing(e);

            _context.Dispose();
        }

        private void AddCourse_Click(object sender, RoutedEventArgs e)
        {
            _context.Courses.Add(new Course
            {
                AuthorId = 1,
                Name = "New Course at " + DateTime.Now.ToShortDateString(),
                Description = "Description",
                FullPrice = 49,
                Level = 1

            });

            _context.SaveChanges();
        }
    }
}