【问题标题】:How to Update multiple tables with foreign keys using LINQ expression ASP.NET MVC Entity Framework如何使用 LINQ 表达式 ASP.NET MVC 实体框架使用外键更新多个表
【发布时间】:2020-05-25 00:40:29
【问题描述】:

我是编程新手,我一直在尝试使用 LINQ 表达式更新多个表,

using (ADBEntities _ADBEntities = new ADBEntities())
{
    try
    {
        tblPerson _Person = new tblPerson();
        _Person.Id = PersonDetails.Id;
        _Person.Firstname = PersonDetails.Firstname;
        _Person.LastName = PersonDetails.LastName;
        _Person.DOB = PersonDetails.DOB;
        _Person.SSN = PersonDetails.SSN;

        var updatePersonDetails = _IPersonRepository.Update(_Person);

        if (updatePersonDetails != null)
        {   
            tblAddress _Address = new tblAddress();
            _Address.PersonId = updatePersonDetails.Id;
            var updateAddressDetails = _ADBEntities.tblAddresses.Find(_Address.PersonId);
            _Address.Id = updateAddressDetails.Id;
            _Address.Address = PersonDetails.Address;

            _ADBEntities.Entry(updateAddressDetails).CurrentValues.SetValues(_Address);
            _ADBEntities.SaveChanges(); 

            if (updateAddressDetails != null)
            {
                tblEmail _Email = new tblEmail();
                _Email.PersonId = updateAddressDetails.PersonId;
                var updateEmailDetails = _ADBEntities.tblEmails.Find(_Email.PersonId);
                _Email.Id = updateEmailDetails.Id;
                _Email.Email = PersonDetails.Email;

                _ADBEntities.Entry(updateEmailDetails).CurrentValues.SetValues(_Email);
                _ADBEntities.SaveChanges();

                if (updateEmailDetails != null)
                {
                    tblPhone _Phone = new tblPhone();
                    _Phone.PersonId = updateEmailDetails.Id;
                    var updatePhoneDetails = _ADBEntities.tblPhones.Find(_Phone.PersonId);
                    _Phone.Id = updatePhoneDetails.Id;
                    _Phone.PhoneNo = PersonDetails.PhoneNo;

                    _ADBEntities.Entry(updatePhoneDetails).CurrentValues.SetValues(_Phone);
                    _ADBEntities.SaveChanges();
                }
            }
        }
    }
}

这在开始时运行良好,但现在它会引发“对象空引用”异常。

表格是

tblPerson
tblAddress
tblPhone
tblEmail

【问题讨论】:

  • 你好 Duminda,欢迎来到 Stack Overflow。你知道它在哪条线上接收object null reference 吗?您是否使用 Visual Studio,以便能够遍历逻辑以确定您的变量在运行时设置的值?
  • 这里跳出来的一件事:您始终在第一次取消引用对象之后检查空值。例如,你打电话给updateAddressDetails.Id,但几行之后检查是否updateAddressDetails != null。那些人意见不一。后者可能永远不会发生 - 但如果是这样,则无需检查。如果它可以发生,空值检查应该更早。此外,如果这些空值检查很重要——我认为它们很重要——你没有updatePhoneDetails 的检查。由于您正在处理NullReferenceException,因此我会立即怀疑。
  • _Address.Id = updateAddressDetails.Id; 这一行抛出一个 object null reference 。我如何设法解决这个问题。问题是,一开始它可以正常工作,第二天问题就来了。我无法理解的是它如何在一个阶段取得成功,然后又陷入异常。
  • 一般来说,在这种情况下,我会假设数据库中发生了一些变化。例如,如果当前用户的地址被删除,那么这将是一个预期的异常,即使代码没有改变。
  • 在我的情况下,假设仍然不可能,因为我使用了级联删除,其中我只删除了用户以及要删除的用户的相关数据。而且我很确定我也没有从地址表中删除任何元组。

标签: c# asp.net-mvc entity-framework linq model-view-controller


【解决方案1】:

如果成功,您不测试您的“查找”。可能这是空的。 你用来更新一个项目的模式有点奇怪,我给你一个你最里面的更新的例子。

if (updateEmailDetails != null)
{
    tblPhone _Phone  = _ADBEntities.tblPhones.Find(updateEmailDetails.Id);
    if (_Phone != null)
       _Phone.PhoneNo = PersonDetails.PhoneNo;
}

仅此而已 您可以在最后调用的 SaveChanges,一次用于所有更新

 _ADBEntities.SaveChanges(); 

您在创建新条目时所做的有时是为了更新条目,而无需先从数据库中获取它。但是您确实获取它(使用查找)。在这种情况下,您可以使用简单的默认路径。

【讨论】:

  • 感谢您的回复,我通过将四个表的所有 id 查看并返回给控制器,并通过存储库到数据库来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多