2

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

很抱歉,如果阅读本文有很多内容需要了解,并且如果需要,我很乐意添加更多代码或解释:)。

4

2 回答 2

1

如果查询没有返回任何结果, FirstOrDefault返回类型的默认值,因此在 FirstOrDefault 之后检查结果是否为空。

它应该看起来像这样

 var orgTD = (from a in context.OrganisationTypeDetails
                         where a.OrganisationTypeDetailID == OrganisationTypeDetailID
                         select a).FirstOrDefault();

 if(orgTD == null)
   return;

如果您确定该查询至少返回一个元素,请改用First

于 2012-11-28T10:13:24.487 回答
0

我花了两周时间处理连接到 MySQL 数据库的 MS Visual Studio .NET 数据实体模型的类似问题。经过 StackOverflow、MySQL 和 MS 站点论坛和帮助资源的大量搜索和搜索,空引用错误的答案正如预期的那样相当简单,所以这里是:

我已经安装了 64 位 MySQL 服务器,但 MS Visual Studio 都是 32 位的。无论我做了什么 app.config 更改,无论我如何使用我的引用,无论我通过 Nuget 安装了多少包,除了卸载 MySQL 64 位之外,我都无法解决这个问题(确保你对现有的首先将数据库转换为模型,以便稍后重新加载它们),然后重新安装 MySQL 32 位。重新创建数据库,重新构建数据实体模型和数据源后,空引用错误得到解决。

所以...如果您将 MySQL 与 MS Visual Studio 一起使用,请确保您拥有 32 位 MySQL 产品。

(我做的另一件事可能会或可能不会影响结果是安装 Windows IIS 以访问 localHost - 但是,我认为这只是分散了真正问题的注意力,因此仅将其添加为最后的手段)。

于 2013-12-13T14:41:14.670 回答