使用实体框架更新数据库会抛出Null Reference Exception

时间:2012-12-10 11:28:31

标签: c# wpf entity-framework data-binding

我正在使用实体框架为组织创建桌面应用程序,以便将数据输入数据库以显示其记录。

我使用tab control创建了一个data template,该commands已经过验证,可以让他们保存必要的必填字段,这些字段到目前为止一直很好。

我在页面上使用了一系列不同的数据网格来显示已添加的详细信息。在此页面中,它包含一系列不同的Null Reference Exception,允许用户添加,更新或删除内容(取决于表,只允许他们更新)。

但这就是我失势的地方。到目前为止,添加和删除方法工作得很好,但是当它归结为更新表时,它会抛出 public List<Employee> LoadEmployee { get { using (DBEntities context = new DBEntities()) { var query = from e in context.Employees select e; return query.ToList<Employee>(); } } } public void UpdateEmployee() { var employee = new Employee(); using (DBEntities context = new DBEntities()) { //var emp = context.Employees.Where(e => e.EmployeeID == employee.EmployeeID).FirstOrDefault(); var emp = (from a in context.Employees where a.EmployeeID == EmployeeID select a).FirstOrDefault(); if (emp == null) { emp.EmployeeID = EmployeeID; emp.OrganisationID = OrganisationID; emp.Title = Title; emp.FirstName = FirstName; emp.Surname = Surname; emp.Position = Position; emp.DateOfBirth = DateOfBirth; emp.Address = Address; emp.Country = Country; emp.Postcode = Postcode; emp.PhoneNumber = PhoneNumber; emp.MobileNumber = MobileNumber; emp.FaxNumber = FaxNumber; emp.Email = Email; emp.NINumber = NINumber; emp.ChargableResource = ChargableResource; emp.ChargeOutRate = ChargeOutRate; emp.TimeSheetRequired = TimeSheetRequired; emp.WorkShift = WorkShift; emp.WorkShift = BenefitsProvided; //context.Employees.Attach(emp); context.SaveChanges(); MessageBox.Show("Updated Employee Details"); } else { MessageBox.Show("Unable to update selected item."); } } } public Employee _SelectedEmployee; public Employee SelectedEmployee { get { return _SelectedEmployee; } set { if (_SelectedEmployee == value) return; _SelectedEmployee = value; OnPropertyChanged("_SelectedEmployee"); } }

以下是一些代码段; 查看 - 型号:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        listview.DataContext = new EmployeeViewModel();
    }

    private void btnupdate_Click(object sender, RoutedEventArgs e)
    {
        var emp = new EmployeeViewModel();

        Employee selected = listview.SelectedItem as Employee;

        if (selected == null)
            MessageBox.Show("You must select a 'Employee' before updating.");
        else
        {
        UpdateEmployeeView update = new UpdateEmployeeView();

        update.ShowDialog();
        Window_Loaded(null, null);
        }
    }

代码背后:

            IsSynchronizedWithCurrentItem="False"
            ItemsSource="{Binding LoadEmployee}"
            SelectedItem="{Binding SelectEmployee}" Grid.RowSpan="2">

XAML;

public int _EmployeeID = 11;
        public int _OrganisationID = 4;

首先,当用户从数据网格中选择一行时,我希望更新该特定行。我已将我的视图模型中的属性绑定到我的xaml中的文本字段,以便它传递给视图模型。我还尝试在视图模型中硬编码ID属性; Null Reference Exception但这仍然会引发{{1}}。

任何人都可以帮我解决这个问题吗?我一直在尝试各种不同的方式,仍然没有用。我是WPF的新手,并试图实现MVVM,显然它不是完全MVVM,但我慢慢地,但肯定是在学习实现它的正确方法。 欢呼声。

2 个答案:

答案 0 :(得分:2)

if (emp == null)
 {

添加行:

emp = new Employee();

否则,您要将值赋给null变量。

答案 1 :(得分:1)

在我的代码隐藏中,我已将TextBox映射到EF中的Entities(我知道这是实现MVVM的错误方法,但我仍在学习这将是改变。

基本上,我将所有textbox分配给项目,而不是分配ID。因此,它不允许我更新,因为由于没有分配ID,它无法识别要更新的表中的哪个项目。

像这样;

txtID.Text = type.OrganisationTypeDetailID.ToString();