C# &引用;对象引用未设置为对象的实例;将EF属性指定给变量时出现异常
当我试图将EF对象模型的一个属性分配给变量时,我得到了一个“对象引用未设置为对象实例”异常,但无法找出原因,因为EF对象肯定包含数据并且可以在C# &引用;对象引用未设置为对象的实例;将EF属性指定给变量时出现异常,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,当我试图将EF对象模型的一个属性分配给变量时,我得到了一个“对象引用未设置为对象实例”异常,但无法找出原因,因为EF对象肯定包含数据并且可以在即时窗口中访问 我调用以下代码从特定组织获取数据: var organizationModelFromDb = this.DbContext.Organizations. SingleOrDefault(o => o.OrganizationId == organizationEditViewModel.Organi
即时窗口中访问
我调用以下代码从特定组织获取数据:
var organizationModelFromDb = this.DbContext.Organizations.
SingleOrDefault(o => o.OrganizationId ==
organizationEditViewModel.Organization.OrganizationId);
这肯定会返回数据,因为当将鼠标悬停在organizationModelFromDb对象上时,我可以在展开工具提示时看到显示的数据。我还可以在键入以下内容时访问数据:
organizationModelFromDb.MembershipType
在即时窗口中
但当我尝试从对象模型中指定此属性时:
var membershipType = organizationModelFromDb.MembershipType;
我得到了提到的例外
该控制器方法中的所有内容都按预期工作,但我正在引入新功能的过程中,但我遇到了这个问题
你知道会发生什么吗。我很确定我在我的项目中到处都在使用相同的技术将EF数据分配给变量,但无论出于什么原因,它在这种方法中都不起作用
我错过了什么
更新-1:
这不是一个重复的问题。引用的文章讨论了对象实际上可能为null的事实,以及如何最好地处理每个场景,但正如所解释的,我的对象实际上不是null。正在返回数据,可通过即时窗口
和工具提示获取
更新-2
这是我从即时窗口调用“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>}
在我的代码中,我得到以下StackTrace异常:
“System.NullReferenceException:对象引用未设置为对象的实例
在C:\Work\Mywebsite\Controllers\OrganizationsController.cs中的Mywebsite.Controllers.OrganizationsController.d_u8.MoveNext()中:第349行“
希望这有助于解决我的问题
更新-3
我删除了此更新中最初提供的代码以保持整洁,而不是提供另一个更新,但下面的代码是控制器中包含的完整代码,但请注意,为了可读性,我删除了不必要的代码:
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();
}
}
}
2) 删除电子邮件部分
new Thread(async () =>
{
await CustomEmailService.SendConfirm(this,
Request, user, codeHtmlVersion);
}).Start();
我知道这听起来很可笑,我已经一遍又一遍地讨论过了,如果我让代码保持原样,我在尝试将变量设置为OrganizationFromDb.MembershipType时会出现此错误。如果我删除上面提到的任何一个部分,一切都会按预期进行
正如@CamiloTerevinto所提到的,我确实相信它与一些尚未完全获取且仅部分构建的内容有关,但这两个部分如何影响这一点
有什么建议吗?我不知道为什么会发生这种情况,也不知道为什么在删除更新中提到的代码片段时它会起作用,但我很确定这确实与@CamiloTerevinto之前提到的仅部分构建/查询EF实体相关
我只能假设在即时窗口中显示数据和/或通过工具提示显示数据的行为与在运行时指定给变量时使用数据的行为不同
无论如何,我想我应该尝试一种不同的方法,而不是试图修复和/或找出删除这些代码片段的原因
由于我的组织详细信息只需要在成员循环中提取一次,因此不需要将其包含在成员循环中
我决定在成员外部分配MembershipType变量
环路
这似乎起到了作用
我想知道这是否与EF的延迟加载有关,或者与它在循环中请求时试图获取组织的EF实体详细信息的情况类似,循环也在获取另一个对象的详细信息。我不确定是否诚实
希望有人强调并解释实际原因
我希望这有帮助。@JSteward这不是一个重复的问题,因为您引用的文章没有解决我的问题。我的问题与EF有关,我得到的错误只有在运行时将其分配给变量时才会发生。如果我错过了你提供的文章中的部分,你能告诉我在哪里可以找到我可能错过的“副本”吗。谢谢。@mjwills,很有趣。我原以为它是特定的对象模型,即OrganizationModel,但我看到,当我从db.GetType().ToString()调用OrganizationModel时,它返回System.Data.Entity.DynamicProxies.OrganizationModel_2AEF19E09C5699B8E172F0AA73D6DB71945EF111ADF7AE5EAEB3AD073A15D5A3@mjwills我看到了“下一步行动”好的,但它不应该抛出此错误,因为organizationModelFromDb应该包含一个基于此的对象:this.DbContext.Organizations.SingleOrDefault…正如您在我的更新中看到的,立即窗口中显示的数据不显示任何“MoveNext”异常,我将继续并用尽可能多的代码再次更新我的问题,但我非常确定我已经提供了所需的一切。事实上,您看到的类来自System.Data.Entity.DynamicProxies.
命名空间意味着您正在使用部分构建/查询的EF实体。请添加整个操作code@CamiloTerevinto你是对的,我已经对此进行了更多的研究,但仍然没有运气。在更新的代码中,我将代码更改为使用FirstOrDefaultAsync
而不是FirstOrDefault
,但这没有什么区别。我还指定了类型,希望它将我的对象转换为特定的模型,而不是看起来像匿名类型的类型,但这也不起作用,即var organizationModelFromDb=wait this.DbContext.Organizations.FirstOrDefaultAsync…。但我确实认为这与此有关。
var password = RandomPassword.Generate();
var result = await this.UserManager.CreateAsync(user, password);
if (result.Succeeded)
{
await this.UserManager.AddToRoleAsync(user.Id, JoiffRoles.IsMember);
…
}
new Thread(async () =>
{
await CustomEmailService.SendConfirm(this,
Request, user, codeHtmlVersion);
}).Start();