2012-12-10 35 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#,所以我正在學習。 –

相關問題