当我尝试将EF对象模型的属性之一分配给变量但无法弄清楚为什么将其作为EF时,出现“对象引用未设置为对象的实例”异常对象肯定包含数据,并且可以在Immediate Window
中访问。
我调用以下代码从特定组织获取数据:
var organizationModelFromDb = this.DbContext.Organizations.
SingleOrDefault(o => o.OrganizationId ==
organizationEditViewModel.Organization.OrganizationId);
这肯定会返回数据,因为当我将鼠标悬停在organizationModelFromDb对象上时,在扩展工具提示时可以看到显示的数据。输入以下内容时,我也可以访问数据:
organizationModelFromDb.MembershipType
在Immediate Window
中,但是当我尝试从这样的对象模型中分配此属性时:
var membershipType = organizationModelFromDb.MembershipType;
我得到了提到的异常。
此Controller方法中的所有功能均按预期工作,但是我正在引入新功能,但我一直困扰于此问题。
任何想法可能会发生什么。我很确定我将在项目的各处使用相同的技术将EF数据分配给变量,但是由于某种原因,它将无法在该方法中使用。
我想念什么?
UPDATE-1:
这不是重复的问题。被引用的文章讨论了这样一个事实,即对象实际上可能为null,以及如何最好地处理每种情况,但是如前所述,我的对象实际上并非为null。数据已返回,可以通过immediate window
和工具提示使用。
Update-2
这是我从immediate window
调用“ organizationModelFromDb”时得到的数据:
{System.Data.Entity.DynamicProxies.
OrganizationModel_2AEF19E09C5699B8E172F0AA73D6DB
71945EF111ADF7AE5EAEB3AD073A15D5A3}
AdditionalDetails:
{System.Data.Entity.DynamicProxies.OrganizationAddition_
05739F8DE2F5D549B3A7FC852AC32ED9C002953ED41AAA7751B12289E23D8A6C}
AutoImport: false
Members: Count = 1
MembershipType: Full
OrganizationId: "4be433d5-48a9-4891-a008-c70fe4cfoie3"
OrganizationName: "My Company"
StatusType: Approved
Website: ""
_entityWrapper: {System.Data.Entity.Core.Objects.Internal.EntityWrapperWithoutRelationships<System.Data.Entity.DynamicProxies.OrganizationModel_2AEF19E09C5699B8E172F0AA73D6DB71945EF111ADF7AE5EAEB3AD073A15D5A3>}
如您所见,对象中有数据。
但是如上所述,当我调用这一行代码时:
var membershipType = organizationModelFromDb.MembershipType;
在我的代码中,出现以下StackTrace异常:
“ System.NullReferenceException:对象引用未设置为对象的实例。
在C:\ Work \ MyWebsite \ Controllers \ OrganizationsController.cs:line 349“中的Mywebsite.Controllers.OrganizationsController.d__8.MoveNext()
希望这有助于解决我的问题。
更新3
我已经删除了此更新中最初提供的代码,以使内容保持整洁,而不是提供另一个更新,但是下面的代码是控制器中包含的完整代码,但是请注意,出于可读性考虑,我删除了不必要的代码:< / p>
var organizationModelFromDb = await this.DbContext.Organizations
.FirstOrDefaultAsync<OrganizationModel>(o => o.OrganizationId ==
organizationEditViewModel.Organization.OrganizationId);
if (ReferenceEquals(organizationModelFromDb, null))
return HttpNotFound();
organizationModelFromDb.StatusType = StatusType.Approved;
var memberModelsFromDb =
this.DbContext.Members.Where(
m => m.OrganizationId ==
organizationEditViewModel.Organization.OrganizationId).ToList();
if (memberModelsFromDb.Count > 0)
{
foreach (var memberModel in memberModelsFromDb.ToList())
{
var user = new ApplicationUser
{
UserName = memberModel.Email,
Email = memberModel.Email,
UserType = UserType.IsMember
};
var password = RandomPassword.Generate();
var result = await this.UserManager.CreateAsync(user, password);
if (result.Succeeded)
{
await this.UserManager.AddToRoleAsync(user.Id, JoiffRoles.IsMember);
try
{
var membershipType = organizationModelFromDb.MembershipType;
}
catch (Exception e)
{
Console.WriteLine(e);
}
string code = await this.UserManager.
GenerateEmailConfirmationTokenAsync(user.Id);
string codeHtmlVersion = HttpUtility.UrlEncode(code);
new Thread(async () =>
{
await CustomEmailService.
SendConfirm(this, Request, user, codeHtmlVersion);
}).Start();
}
}
}
现在您可以看到,此代码没有什么特别的。我正在检查组织是否存在,然后获取该组织的所有成员,然后遍历每个成员并创建一个用户并将角色添加到数据库中。创建成功后,它将向新创建的用户发送一封包含凭据信息的电子邮件。
现在很奇怪的是,上面的代码出现了“对象引用未设置为对象实例”的异常,但是以某种方式,如果我注释任何一段代码,都不会发生:
1)删除try / catch上方的所有内容,但将电子邮件部分保留在try catch的下方:
var password = RandomPassword.Generate();
var result = await this.UserManager.CreateAsync(user, password);
if (result.Succeeded)
{
await this.UserManager.AddToRoleAsync(user.Id, JoiffRoles.IsMember);
…
}
2)删除电子邮件部分
new Thread(async () =>
{
await CustomEmailService.SendConfirm(this,
Request, user, codeHtmlVersion);
}).Start();
我知道这听起来很荒谬,我已经一遍又一遍地进行了研究,如果我按原样保留代码,则在尝试将变量设置为OrganizationFromDb.MembershipType时遇到此错误。如果我删除上面提到的任何一个部分,一切都会按预期进行。
正如@CamiloTerevinto所提到的,我确实相信这与尚未完全获取并且仅部分构建的事物有关,但是任何一个部分如何影响到这一点?
有什么建议吗?
答案 0 :(得分:0)
我还没弄清楚为什么会这样,或者为什么在删除更新中提到的代码片段时却无法工作,但是我很确定这确实与@CamiloTerevinto之前提到的有关EF实体仅部分构建/查询。
我只能假设在Immediate window
中和/或通过工具提示显示数据的行为与在运行时分配给变量的数据的行为不同。
无论如何,我没有尝试固定和/或弄清楚为什么删除这些代码片段能达到目的,我想我会尝试另一种方法。
由于仅在不需要将其放入成员循环中时才需要提取我的组织详细信息,所以
我决定在Members之外分配MembershipType变量 循环
这似乎可以解决问题。
我想知道它是否与EF的延迟加载或与之类似的东西有关,即它试图在循环中获取组织的EF实体详细信息时也要获取另一个对象的详细信息。我不敢诚实。
希望有人强调和解释实际原因。
我希望有帮助。