经过一段时间调查我的导航属性为什么再次填充我刚删除的实体(使用entity.NavigationPropertiesCollection = new List <>()),我意识到使用entity.NavigationPropertiesCollection.Clear()一切正常 . 我的问题是为什么Entity Framework Core在重新初始化导航属性集合之后再次加载导航属性以及为什么使用entity.NavigationPropertiesCollection.Clear()一切正常? (按预期删除它们)
先决条件nuget包:Microsoft.EntityFrameworkCore.Proxies
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
先决条件代码:
public class FooChildEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class FooParentEntity
{
public int Id { get; set; }
public string Title { get; set; }
public virtual List<FooChildEntity> FooChildEntities { get; set; }
}
internal class FooDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(@"Server=.\sqlexpress;Database=fooDb;Trusted_Connection=True;");
}
public DbSet<FooParentEntity> FooParentEntities { get; set; }
}
代码重现:
首先运行此代码:
FooParentEntity fooParentEntityInput = new FooParentEntity
{
Title = "cool title",
FooChildEntities = new List<FooChildEntity>
{
new FooChildEntity
{
Name = "FirstChild"
},
new FooChildEntity
{
Name="SecondChild"
}
}
};
FooDbContext fooDbContext = new FooDbContext();
fooDbContext.FooParentEntities.Add(fooParentEntityInput);
fooDbContext.SaveChanges();
并删除它或将其注释掉 .
之后,下面的代码使用截图中的断点
FooDbContext fooDbContext = new FooDbContext();
FooParentEntity fooParentEntityDb = fooDbContext.FooParentEntities.ToList().FirstOrDefault();
fooParentEntityDb.FooChildEntities = new List<FooChildEntity>();
fooParentEntityDb.FooChildEntities.Add(new FooChildEntity { Name = "ThirdChild" });
此处出现错误:https://i.stack.imgur.com/tZ1j0.png但是如果在调试时使用多个断点,请参见屏幕截图:https://i.stack.imgur.com/naCxJ.png https: //i.stack.imgur.com/Ky7K5.png https://i.stack.imgur.com/iziRr.png一切都很完美 .