无法更新数据网格中的项目“对象引用未设置为对象的实例”。

时间:2012-11-28 09:41:11

标签: c# wpf entity-framework data-binding mvvm

我的应用程序存在问题,而且没有选择使用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表达式,但似乎都没有用。

很抱歉,如果有很多内容可以阅读本文,并且很乐意在需要时添加更多代码或说明:)。

2 个答案:

答案 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 - 我认为这只是分散了真正的问题,但是,所以只能添加它作为最后的手段)。