我有一个带有主表和子表的Entity Framework Core 2.2模型。所有表都具有一对一的关系。主表和子表均具有链接到同一查找表的字段。主表的链接与MainTable.NameLookup一起正常工作,该表显示了所有字段和数据。即使使用Include / ThenInclude,指向子表的链接也将导致空结果。因此,ChildTable.NameLookup存在,但为空。我希望我能清楚地陈述这一点。这是我在做什么的伪代码。
那么我想在框架中做什么呢?如果可以的话,我还缺少什么?
class MyContext : DbContext
{
public virtual DbSet<MainTable> MainTable { get; set; }
public virtual DbSet<ChildTable> ChildTable { get; set; }
public virtual DbSet<NameLookup> NameLookup{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MainTable>()
.HasOne(w => w.NameLookup)
.WithOne(p => p.MainTable)
.HasPrincipalKey<MainTable>(d => d.NameCode1)
.HasForeignKey<NameLookup>(p => p.NameCode)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<ChildTable>()
.HasOne(w => w.NameLookup)
.WithOne(p => p.ChildTable)
.HasPrincipalKey<ChildTable>(d => d.NameCode2)
.HasForeignKey<NameLookup>(p => p.NameCode)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<ChildTable>()
.HasOne(d => d.FileNumberNavigation)
.WithOne(p => p.ChildTable)
.HasForeignKey<ChildTable>(d => d.FileNumber);
}
}
public class MainTable
{
public string FileNumber { get; set; }
public string NameCode1 { get; set; }
public virtual ChildTable ChildTable { get; set; }
public virtual NameLookup NameLookup { get; set; }
}
public class ChildTable
{
public string FileNumber { get; set; }
public string NameCode2 { get; set; }
public virtual MainTable FileNumberNavigation { get; set; }
public virtual NameLookup NameLookup { get; set; }
}
public class NameLookup
{
public string NameCode { get; set; }
public string MoreInfo { get; set; }
public virtual ChildTable ChildTable { get; set; }
public virtual MainTable MainTable { get; set; }
}
这是针对winforms应用程序的。在应用程序中,我使用以下代码段检索MainTable dbSet:
private readonly DbSet<MainTable > dbSetEntity;
public MainTableRepository(DbContext dbContext) : base(dbContext)
{
base.dbContext = dbContext;
dbSetEntity = dbContext.Set<MainTable >();
}
public MainTable GetMainTable(string FileNumber )
{
return dbSetEntity
.Include(t => t.ChildTable)
.ThenInclude(d => d.NameLookup)
.SingleOrDefault(a => a.FileNumber == FileNumber);
}
public string GetMoreInfo (string FileNumber)
{
var q = from e in dbSetEntity
where e.FileNumber == FileNumber
select e.ChildTable.NameLookup.MoreInfo ;
return q.FirstOrDefault();
}
调用GetMainTable返回MainTable字段和数据,并且还包含MainTable.ChildTable字段和数据。但是MainTable.ChildTable.NameLookup为null。
如果我调用GetMoreInfo,它将从NameLookup.MoreInfo字段中返回字段数据。