我的应用程序存在问题,而且没有选择使用EF进行更新的项目。
我正在为用户创建一个应用程序,以输入他们的组织详细信息。看起来很简单。使用选项卡控件输入数据后,我有一个包含一系列数据网格的视图,使用户能够更新,或在需要时插入另一段数据或能够删除。
在我的视图模型中,我有一系列不同的东西(可能不是实现MVVM但最终尝试到达的最佳方式)。我有我的属性实现INOTIFYPROPERTYCHANGE
。用于保存,更新和删除的命令。我的实体方法(使用实体框架的CRUD操作 - 稍后当我了解更多有关MVVM的内容时将使用存储库系统等)。
到目前为止,我不得不使用视图的代码隐藏来加载我的数据,这些数据完美无缺(显然我不应该这样做,所以任何向我显示的建议都会非常感激),就像这样;
private void Page_Loaded(object sender, RoutedEventArgs e)
{
DBEntities context = new DBEntities();
var orgTypeDetails = (from o in context.OrganisationTypeDetails
select o).ToList();
dgOrgTypeDetail.ItemsSource = orgTypeDetails;
}
我还有一个事件处理程序,它只允许您选择一行然后更新该特定行;
private void btnUpdateOrgTypeDetail_Click(object sender, RoutedEventArgs e)
{
OrganisationTypeDetailViewModel org = new OrganisationTypeDetailViewModel();
OrganisationTypeDetail selected = dgOrgTypeDetail.SelectedItem as OrganisationTypeDetail;
if (selected == null)
MessageBox.Show("You must select a 'Type' before updating.");
else
{
OrganisationTypeDetailUpdateView update = new OrganisationTypeDetailUpdateView();
update.ShowDialog();
org.UpdateOrganisationTypeDetail(selected);
Page_Loaded(null, null);
}
}
最后,我的方法是使用View-Model中的EF更新表格;
public void UpdateOrganisationTypeDetail(OrganisationTypeDetail orgTypeDetail)
{
using (DBEntities context = new DBEntities())
{
//var orgTD = context.OrganisationTypeDetails.Where(otd => otd.OrganisationTypeDetailID == OrganisationTypeDetailID).FirstOrDefault();
var orgTD = (from a in context.OrganisationTypeDetails
where a.OrganisationTypeDetailID == OrganisationTypeDetailID
select a).FirstOrDefault();
orgTD.OrganisationTypeDetailID = OrganisationTypeDetailID;
orgTD.OrganisationTypeID = OrganisationTypeID;
orgTD.Title = Title;
orgTD.FirstName = FirstName;
orgTD.Surname = Surname;
orgTD.Position = Position;
orgTD.DateOfBirth = DateOfBirth;
orgTD.Address = Address;
orgTD.Country = Country;
orgTD.Postcode = Postcode;
orgTD.PhoneNumber = PhoneNumber;
orgTD.MobileNumber = MobileNumber;
orgTD.FaxNumber = FaxNumber;
orgTD.Email = Email;
orgTD.NINumber = NINumber;
context.OrganisationTypeDetails.ApplyCurrentValues(orgTD);
context.SaveChanges();
MessageBox.Show("Updated Organisation Type Details");
}
执行此应用程序时,会生成Null Reference exception
。
在我的属性中,为了确保它不会崩溃,我必须以编程方式设置ID;
public int _OrganisationTypeDetailID=17;
但是我希望能够选择一个行,而不是只选择从17开始获取行。
我尝试过使用Linq和Lamba表达式,但似乎都没有用。
很抱歉,如果有很多内容可以阅读本文,并且很乐意在需要时添加更多代码或说明:)。
答案 0 :(得分:1)
FirstOrDefault将返回type的默认值,因此在FirstOrDefault之后,allays检查结果是否为null。
看起来应该是这样的
var orgTD = (from a in context.OrganisationTypeDetails
where a.OrganisationTypeDetailID == OrganisationTypeDetailID
select a).FirstOrDefault();
if(orgTD == null)
return;
如果您确定,该查询至少返回一个元素,请使用First代替
答案 1 :(得分:0)
我花了两周时间处理与连接到MySQL数据库的MS Visual Studio .NET数据实体模型类似的问题。通过StackOverflow,MySQL和MS站点论坛以及帮助资源进行了大量的研究和搜索后,空引用错误的答案正如预期的那样相当简单,所以这里是:
我安装了64位MySQL服务器但是MS Visual Studio全部是32位。无论我做了什么app.config更改,无论我如何使用我的引用,无论我通过Nuget安装了多少包,我都无法解决问题,除非卸载MySQL 64位(确保你对现有版本进行反向工程)首先建模型数据库,以便稍后重新加载它们,然后重新安装MySQL 32位。重新创建数据库,重建数据实体模型和数据源后,空引用错误已解决。
所以...如果您在MS Visual Studio中使用MySQL,请确保您拥有32位MySQL产品。
(我做的另一件事可能会或可能不会影响结果是安装Windows IIS来访问localHost - 我认为这只是分散了真正的问题,但是,所以只能添加它作为最后的手段)。