ASP.Net Entity Framework 一对多关系:如何建立依赖和延迟加载不起作用

ASP.Net Entity Framework one-to-many relationship: How to establish dependency and lazy loading not working

我有两个 class。 class BC_Instance 可以有多个 BC_InstanceSession 并且 BC_InstanceSessiondependent on a BC_Instance 并且应该在以下情况下删除它的相对 BC_Instance 被删除。

//Instance
public class BC_Instance
{
    public int ID { get; set; }
    //sessions
    public ICollection<BC_InstanceSession> sessions { get; set; }
}

//Instance session
public class BC_InstanceSession
{
    [Key]
    public int ID { get; set; }
    [ForeignKey("Instance")]
    public int InstanceID { get; set; }
    public virtual BC_Instance Instance { get; set; }
}

我发现此配置存在一些问题。首先 Sessions 在删除 Instance 时不会被删除。是否可以指定没有实例的会话不能存在或者我需要手动删除它们?

其次 映射到数据库时似乎有问题。会话在数据库上有两个外键 InstanceIDBC_Instance_ID,如下图所示:

终于延迟加载不起作用。需要显式加载才能访问实例的会话(下面的代码)

BC_Instance instance = db.BiocloudInstances.Include(i => i.sessions).Where(i => i.ID == id).First();

对于 第一个 问题,您可以使用 CascadeOnDelete,例如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
   modelBuilder.Entity<BC_Instance>()
               .HasMany(i => i.sessions) 
               .WithRequired(s => s.Instance) 
               .WillCascadeOnDelete(true);
   }

对于 second,如果您查看 EntityFramework 文档,他们会指定使用 1-n 关系而不使用 ForeignKey 注释。因此,由于您声明了虚拟关系,因此 EF 将添加 2 个键。要解决此问题,请删除 ForeignKey 注释和 public int InstanceID { get; set; } 行。 (更多内容在他们的页面 here

第三,正如我在评论中指定的,
延迟加载不起作用,因为您没有为 ICollection 指定 virtual。喜欢:public virtual ICollection<BC_InstanceSession> sessions { get; set; }