我正在使用實體框架爲組織創建桌面應用程序,以將其數據輸入數據庫以顯示其記錄。使用實體框架更新數據庫將引發空引用異常
我創建了一個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,但我正在慢慢地學習正確的實現方式。 乾杯。
對不起,你不同意Michael的看法,但這只是表示如果沒有員工指定了id,那麼你將添加一個新員工,由於它是一個Update方法而不是SaveOrUpdate一。 Gregory,如果可能的話,你還應該清理一下你的代碼,因爲有很多變量你使用並且什麼也不做,並且創建對你已有的東西有新意義的對象(var emp = new EmployeeViewModel(); 而不是正確使用DataContext並將其轉換爲正確的對象類型)。 – Raposo
感謝您的回覆。我試過了,但它似乎仍然返回'MessageBox.show(「無法選擇項目」);' –
感謝您的回覆@Raposo,顯然這不是最後一段代碼。我一直在努力做不同的事情,因爲它工作,我是新來的wpf和C#,所以我正在學習。 –