C# 实体框架Include-返回NULL
我想用一个DB调用加载EF相关的实体(急切加载),为了实现这一点,我尝试使用如下的include语句C# 实体框架Include-返回NULL,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我想用一个DB调用加载EF相关的实体(急切加载),为了实现这一点,我尝试使用如下的include语句 var db = _DbContext; var r1 = await db.Request.Where(r => idList.Contains(r.RequestId)) .Include(r => r.RequestedService) ...more include
var db = _DbContext;
var r1 = await
db.Request.Where(r => idList.Contains(r.RequestId))
.Include(r => r.RequestedService)
...more include
...more include
...more include
.ToListAsync();
当我使用include语句运行它时,我得到一个返回null的项,但是如果我不使用include运行它,它将返回实体。在上面的语句之后,如果我添加以下空检查条件,我将返回实体
if(r1.HasAny() && r1[0] == null)
{
r1 =
await
db.Request.Where(r => idList.Contains(r.RequestId)).ToListAsync();
}
当添加一个include可以更改退货时,原因可能是什么?我已将导航属性设置为虚拟和公共
添加实体
public class Request : BaseEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long RequestId { get; set; }
public virtual ICollection<RequestedService> RequestedService { get; set; }
}
public class RequestedService : BaseEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long RequestedServiceId { get; set; }
[Required]
public long RequestId { get; set; }
public virtual Request Request { get; set; }
}
public class RequestDbContext : DbContextBase
{
public object SyncObject = new object();
public RequestDbContext()
{
Database.SetInitializer<RequestDbContext>(null);
}
public RequestDbContext(string connectionStringName) : base(string.Empty)
{
Database.SetInitializer<RequestDbContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
public virtual DbSet<Request> Request { get; set; }
public virtual DbSet<RequestedService> RequestedService { get; set; }
public class RequestDbContextInitializer : CreateDatabaseIfNotExists<RequestDbContext>
{
protected override void Seed(RequestDbContext context)
{
base.Seed(context);
}
}
}
公共类请求:BaseEntity
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共长请求ID{get;set;}
公共虚拟ICollection RequestedService{get;set;}
}
公共类RequestedService:BaseEntity
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long RequestedServiceId{get;set;}
[必需]
公共长请求ID{get;set;}
公共虚拟请求{get;set;}
}
公共类RequestDbContext:DbContextBase
{
公共对象SyncObject=新对象();
公共RequestDbContext()
{
Database.SetInitializer(null);
}
public RequestDbContext(string connectionStringName):基(string.Empty)
{
Database.SetInitializer(null);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
基于模型创建(modelBuilder);
}
公共虚拟数据库集请求{get;set;}
公共虚拟数据库集RequestedService{get;set;}
公共类RequestDbContextInitializer:CreateDatabaseIfNotExists
{
受保护的覆盖无效种子(RequestDbContext上下文)
{
种子(上下文);
}
}
}
您是否尝试过增量引入包含的关系?凭直觉我会看到一个错误的FK声明在一个必要的关系。EF将应用这些作为内部联接,如果它恰好映射到错误的列,则可能导致主记录无法返回。(或者在其他情况下,返回错误的相对行。)谢谢@StevePy Yes,即使我尝试只添加单个包含,也会导致问题。此外,我还跟踪了生成的查询,查询返回的数据正确,并在正确的键上进行了正确的连接。。。你能为请求和单一包含场景(假设RequestedService)提供实体定义和任何配置吗?好的,我仍然怀疑FK不匹配。我看到的一件事是,在RequestService(RequestSkill?)中,RequestId应该标记为[ForeignKey(Request)]
,而不是[Required]
。在正确返回实体的情况下,请根据您的数据检查引用的实体,它们是否正确或与其他请求关联?.Include不会创建内部联接,而是创建左外部联接。然而,我预计其中会出现异常,可能是由于不匹配的模式。