2012-12-10 34 views
1

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

我创建了一个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); 
     } 
    } 

XAML;

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

首先,当用户从数据网格中选择一行时,我想要更新特定的行。我已将我的视图模型中的属性绑定到我的xaml中的文本字段,以便它传递给视图模型。我也尝试在我的视图模型中硬编码ID属性; public int _EmployeeID = 11; public int _OrganisationID = 4;但这仍然会抛出Null Reference Exception

任何人都可以帮助解决这个问题吗?我一直在尝试各种不同的方式,仍然没有用。我对WPF很陌生,试图实现MVVM,显然它不是MVVM,但我正在慢慢地学习正确的实现方式。 干杯。

回答

1

在我的代码隐藏我制订了TextBox在EF的Entities(我知道这是实现MVVM不正确的方式,但因为我仍然在学习,这将被改变。

基本上,我被分配所有textbox的项目并没有被分配ID因此,它不会让我更新,因为它可能没有确定要更新的项目从表由于没有被分配的ID

像这样;

txtID.Text = type.OrganisationTypeDetailID.ToString(); 
2
if (emp == null) 
{ 

添加一行:

emp = new Employee(); 

否则,你要分配值为null变量。

+0

对不起,你不同意Michael的看法,但这只是表示如果没有员工指定了id,那么你将添加一个新员工,由于它是一个Update方法而不是SaveOrUpdate一。 Gregory,如果可能的话,你还应该清理一下你的代码,因为有很多变量你使用并且什么也不做,并且创建对你已有的东西有新意义的对象(var emp = new EmployeeViewModel(); 而不是正确使用DataContext并将其转换为正确的对象类型)。 – Raposo

+0

感谢您的回复。我试过了,但它似乎仍然返回'MessageBox.show(“无法选择项目”);' –

+0

感谢您的回复@Raposo,显然这不是最后一段代码。我一直在努力做不同的事情,因为它工作,我是新来的wpf和C#,所以我正在学习。 –

相关问题