C# EF有时在外键类型上返回null
我有一个WebAPI控制器,它需要从数据库返回一个集合,但我还需要从一些实体中删除一些属性。但是,出于某种原因,表示另一个实体的属性返回null,除非有时我在调试模式下单步执行代码。我在下面显示了json响应,其中显示Sport、HomeTeam和AwayTeam为空: 但当我在调试模式下跳过代码时,我得到了预期的结果: 相关控制器方法如下所示C# EF有时在外键类型上返回null,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我有一个WebAPI控制器,它需要从数据库返回一个集合,但我还需要从一些实体中删除一些属性。但是,出于某种原因,表示另一个实体的属性返回null,除非有时我在调试模式下单步执行代码。我在下面显示了json响应,其中显示Sport、HomeTeam和AwayTeam为空: 但当我在调试模式下跳过代码时,我得到了预期的结果: 相关控制器方法如下所示 public dynamic Get() { var allPicks = _db.Picks; if (User.Identity
public dynamic Get()
{
var allPicks = _db.Picks;
if (User.Identity.IsAuthenticated)
{
string userId = User.Identity.GetUserId();
var picks = _db.UnlockedPicks
.Include(p => p.SelectedPick.AwayTeam)
.Include(p => p.SelectedPick.HomeTeam)
.Include(p => p.SelectedPick.Sport)
.Where(p => p.UserId == userId);
var unlockedPicks = picks.Select(p => p.SelectedPick);
var otherPicks = allPicks.Except(unlockedPicks).Select(p => new
{
Analysis = "",
PickSummary = "",
Title = p.Title,
Id = p.Id,
Sport = p.Sport,
HomeTeam = p.HomeTeam,
AwayTeam = p.AwayTeam,
MatchTime = p.MatchTime,
PublishTime = p.PublishTime
});
return new
{
UnlockedPicks = unlockedPicks.OrderByDescending(p => p.MatchTime),
OtherPicks = otherPicks.OrderByDescending(p => p.MatchTime)
};
}
var publicPicks = allPicks.OrderByDescending(p => p.MatchTime).Select(p => new
{
Analysis = "",
PickSummary = "",
Title = p.Title,
Id = p.Id,
Sport = p.Sport,
HomeTeam = p.HomeTeam,
AwayTeam = p.AwayTeam,
MatchTime = p.MatchTime,
PublishTime = p.PublishTime
});
return new { UnlockedPicks = new Pick[0], OtherPicks = publicPicks };
}
如果没有
Include()
,它每次都返回null,但是如何使它每次都返回预期的结果呢?这是因为您没有使用延迟加载。禁用延迟加载时,必须调用Include
,以加载导航属性。如果要加载所有导航属性,而不调用Include
,则必须激活延迟加载,这可以通过上下文的构造函数完成。像这样:
public partial class SchoolDBEntities : DbContext
{
public SchoolDBEntities(): base("name=SchoolDBEntities")
{
this.Configuration.LazyLoadingEnabled = true;
}
}
默认情况下,应激活延迟加载。您可能已经在代码中的其他地方停用了它。每次在调试模式下检查导航属性时,也会自动调用它。这是因为您没有使用延迟加载。禁用延迟加载时,必须调用
Include
,以加载导航属性。如果要加载所有导航属性,而不调用Include
,则必须激活延迟加载,这可以通过上下文的构造函数完成。像这样:
public partial class SchoolDBEntities : DbContext
{
public SchoolDBEntities(): base("name=SchoolDBEntities")
{
this.Configuration.LazyLoadingEnabled = true;
}
}
默认情况下,应激活延迟加载。您可能已经在代码中的其他地方停用了它。每次您在调试模式下检查导航属性时,它也会自动调用。我尝试过,但从“System.Data.Entity.DynamicProxies.Pick”上的“AwayTeam”获取值时出现
错误。
该类具有一些无法转换为JSON的属性。永远不要返回整个对象。相反,您应该创建对象的视图模型实例,然后将其序列化为json。看看这个链接,我最终解决了这个问题,只存储了未锁定拾取的Id,并使用该Id获取要返回的拾取列表。EF-Core
中没有Configuration
属性。我使用了this.ChangeTracker.LazyLoadingEnabled=true代码>在EF Core中,但不起作用。但这对我来说是这样的:我试过了,但后来从System.Data.Entity.DynamicProxies.Pick_300c9b9073e6c214ae564ba2a5a64098700cfa4a7828382a5ec6bd386ab3aa63上的“AwayTeam”获取值时出现了错误。
这个类有一些无法转换为JSON的属性。永远不要返回整个对象。相反,您应该创建对象的视图模型实例,然后将其序列化为json。看看这个链接,我最终解决了这个问题,只存储了未锁定拾取的Id,并使用该Id获取要返回的拾取列表。EF-Core
中没有Configuration
属性。我使用了this.ChangeTracker.LazyLoadingEnabled=true代码>在EF Core中,但不起作用。但这是对我的: