У меня есть модель Entity Framework Core 2.2 с основными и дочерними таблицами.Все таблицы имеют отношение один к одному.Обе таблицы Master и Child имеют поля, которые связаны с одной и той же таблицей поиска.Ссылка на главную таблицу работает, как и ожидалось, с MainTable.NameLookup, показывая все поля и данные.Ссылка на дочернюю таблицу приводит к нулевому результату даже с Include / ThenInclude.Таким образом, ChildTable.NameLookup существует, но имеет значение null.Я надеюсь, что я представляю это ясно.Вот псевдокод того, что я делаю.
Так что же я пытаюсь сделать доступным в рамках, и если да, то чего мне не хватает?
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.