尝试使计算属性与实体框架配合得很好
本文关键字:框架 很好 实体 计算 属性 | 更新日期: 2023-09-27 17:58:19
这是我正在使用的类的简化版本:
public class Parent
{
public int Id { get; set; }
public List<Child> Children { get; set; }
public int ChildrenSum { get { return Children.Sum(c => c.Value); } }
}
public class Child
{
public int Id { get; set; }
public int Value { get; set; }
public Parent Parent { get; set; }
}
public class TestDbContext : DbContext
{
public DbSet<Parent> Parents { get; set; }
public DbSet<Child> Children { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Child>().HasRequired(e => e.Parent);
modelBuilder.Entity<Parent>().HasMany(e => e.Children);
}
}
public class TestDbContextInitializer : DropCreateDatabaseAlways<TestDbContext>
{
protected override void Seed(TestDbContext context)
{
var parent = new Parent { Children = new List<Child>() };
parent.Children.Add(new Child { Value = 3 });
parent.Children.Add(new Child { Value = 1 });
parent.Children.Add(new Child { Value = 2 });
context.Parents.Add(parent);
}
}
当我运行所有内容时,所有种子信息都在数据库中,但 ChildrenSum 属性失败,因为子项没有被急切加载。 我期望它们会是,因为我没有使导航属性成为虚拟的。 我错过了什么吗?
当您创建导航属性virtual
时,将启用延迟加载。你说得对。但在这种情况下,延迟加载的反面不是急切加载。它是"除非你进行装载,否则没有加载"。
因此,您要么必须启用延迟加载,要么使用 Include
.或者做类似的事情
db.Entry(parent).Collection(p => p.Children).Load();
其中db
是TestDbContext
实例,parent
是提取的Parent
对象。