我正在使用实体框架为组织创建桌面应用程序,以将其数据输入数据库以显示其记录。使用实体框架更新数据库将引发空引用异常
我创建了一个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#,所以我正在学习。 –