【发布时间】: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