Entity Framework 递归附加
Recursive attaching in Entity Framework
假设我有两个实体,Folder
和 File
,这是它们的简化结构:
File
public virtual Folder ParentFolder
Folder
public virtual List<File> Files
现在假设用户正在异步快速创建多个文件、文件夹等,当然我通过为每个操作创建一个新的 DbContext
来解决这个问题,例如当用户创建一个文件夹时,我执行以下操作:
var file = new File (fileModel);
var folder = context.Attach (GetFromInMemoryCacheById (fileModel.FolderId));
file.ParentFolder = folder;
folder.Files.Add (file);
context.SaveChanges ();
很快我就遇到了一个问题,每当我附加现有文件夹时,它的所有子项通常都以已添加状态附加。因此,由于我得到重复键添加异常,我被迫另外做这样的事情,所以他们得到 Unchanged
state:
folder.Files.ForEach (file => context.Attach (File));
但是现在图像我的结构有点大,我还有另一层,例如Disk
。突然间,即使是最简单的保存操作,我也必须 运行 通过很多实体才能使它们处于 Unchanged
状态,这真的很快就失控了。
什么方法可以使 DbContext
只关心 File
及其父级 Folder
,而完全忽略 Files
的列表,所以我会不必一直修复他们的状态?
不想弄乱 ID 或将任何不应为 null 的内容设置为 null,所以我最终在 public virtual List<File> Files
上设置了 [NotMapped]
。我牺牲了从数据库加载文件夹时设置 属性 的舒适性(我必须手动完成,但加载操作很少见,主要是我关心连续保存),但现在意外实体不再进入范围。希望这种方法对处理 EF 中异步保存的其他人有所帮助。
假设我有两个实体,Folder
和 File
,这是它们的简化结构:
File
public virtual Folder ParentFolder
Folder
public virtual List<File> Files
现在假设用户正在异步快速创建多个文件、文件夹等,当然我通过为每个操作创建一个新的 DbContext
来解决这个问题,例如当用户创建一个文件夹时,我执行以下操作:
var file = new File (fileModel);
var folder = context.Attach (GetFromInMemoryCacheById (fileModel.FolderId));
file.ParentFolder = folder;
folder.Files.Add (file);
context.SaveChanges ();
很快我就遇到了一个问题,每当我附加现有文件夹时,它的所有子项通常都以已添加状态附加。因此,由于我得到重复键添加异常,我被迫另外做这样的事情,所以他们得到 Unchanged
state:
folder.Files.ForEach (file => context.Attach (File));
但是现在图像我的结构有点大,我还有另一层,例如Disk
。突然间,即使是最简单的保存操作,我也必须 运行 通过很多实体才能使它们处于 Unchanged
状态,这真的很快就失控了。
什么方法可以使 DbContext
只关心 File
及其父级 Folder
,而完全忽略 Files
的列表,所以我会不必一直修复他们的状态?
不想弄乱 ID 或将任何不应为 null 的内容设置为 null,所以我最终在 public virtual List<File> Files
上设置了 [NotMapped]
。我牺牲了从数据库加载文件夹时设置 属性 的舒适性(我必须手动完成,但加载操作很少见,主要是我关心连续保存),但现在意外实体不再进入范围。希望这种方法对处理 EF 中异步保存的其他人有所帮助。