C# EntityFramework一对多虚拟列表保存后为空

C# EntityFramework一对多虚拟列表保存后为空,c#,entity-framework,C#,Entity Framework,我遇到过这种奇怪的行为,这是我在其他EF项目中从未见过的。具体项目分为3类;文件、记录和元素。首先从上下文中提取文件,然后向文件中添加记录,然后向记录中添加元素,然后保存。很基本的东西,对吧 但是,保存后,Record.Elements为空;保存前为16,保存后为0。元素被保存到数据库中,只是虚拟列表被清空 同样奇怪的是,如果我查询元素,结果会返回(见下文) 我确实有LazyLoadingEnabled=true,如果这很重要的话 public class File { public int

我遇到过这种奇怪的行为,这是我在其他EF项目中从未见过的。具体项目分为3类;文件、记录和元素。首先从上下文中提取文件,然后向文件中添加记录,然后向记录中添加元素,然后保存。很基本的东西,对吧

但是,保存后,Record.Elements为空;保存前为16,保存后为0。元素被保存到数据库中,只是虚拟列表被清空

同样奇怪的是,如果我查询元素,结果会返回(见下文)

我确实有LazyLoadingEnabled=true,如果这很重要的话

public class File
{
 public int Id{get;set;}

 public virtual List<Records> Records{get;set;}
}

public class Record
{
 public int FileId{get;set;}

 public int Id{get;set;}


 [ForeignKey("FileId")]
 public virtual File File{get;set;

 public virtual List<Element> Elements{get;set;}
}

public class Element
{
 [ForeignKey("Record")]
 public int FileId{get;set;}
 [ForeignKey("Record")]
 public int RecordId{get;set;}

 public string ElementName{get;set;}

 public virtual Record Record{get;set;}
}
公共类文件
{
公共int Id{get;set;}
公共虚拟列表记录{get;set;}
}
公开课记录
{
public int FileId{get;set;}
公共int Id{get;set;}
[外键(“文件ID”)]
公共虚拟文件{get;set;
公共虚拟列表元素{get;set;}
}
公共类元素
{
[外键(“记录”)]
public int FileId{get;set;}
[外键(“记录”)]
public int RecordId{get;set;}
公共字符串ElementName{get;set;}
公共虚拟记录记录{get;set;}
}
这就是我的代码流程和Record.Elements的结果

void DoStuff(DbContext context, int fileId)
{
   var file = context.Files.FirstOrDefault(file=>file.Id = fileId);

   Record record;
   file.Records.Add(record = new Record{
     File = file,
     ...
   });

   for (var i = 0;i < 17; i++)
   {
     record.Elements.Add(new Element{
       Record = record,
       ...
     });
   }

   // Record.Elements.Count = 16

  context.SaveChanges();

   // Record.Elements.Count = 0

   var elements = Current.Context.FileElements.Where(e => e.RecordId == fileRecord.Id).ToList();

   // Record.Elements.Count = 16 again (with the lazy loading string from hell)
}
void DoStuff(DbContext上下文,int fileId)
{
var file=context.Files.FirstOrDefault(file=>file.Id=fileId);
记录;
file.Records.Add(记录=新记录{
File=File,
...
});
对于(变量i=0;i<17;i++)
{
record.Elements.Add(新元素{
记录,
...
});
}
//Record.Elements.Count=16
SaveChanges();
//Record.Elements.Count=0
var elements=Current.Context.FileElements.Where(e=>e.RecordId==fileRecord.Id).ToList();
//Record.Elements.Count再次=16(使用来自地狱的延迟加载字符串)
}
我需要弄清楚为什么列表会被清空,因为如果没有这些元素,我的类就没用了,执行我认为不必要的查询。我不明白发生了什么


**7/6更新:仍然存在问题,我发现如果我在将记录添加到文件后保存,并且在将元素添加到记录之前保存,它的行为与预期一致,元素列表不再为空。

您是否初始化过
元素
属性?如果仅针对这种情况,
LazyLoadingEnabled=false
会怎么样?您的列表是否为空仍然为空?此外,发布的模型无效-元素
包含无效的复合FK定义,并且没有PK。这只是徒手编写的代码,为您提供更大代码库的要点;是的,记录。元素已初始化,主键已使用Fluent API定义。@Antoine此行为持续存在,LazyLoadingEnabled=false、 这包括在Context.FileElements.Where(…)语句之后填充的Record.Elements。