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_InstanceSession
是 dependent 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 时不会被删除。是否可以指定没有实例的会话不能存在或者我需要手动删除它们?
其次 映射到数据库时似乎有问题。会话在数据库上有两个外键 InstanceID
和 BC_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; }
我有两个 class。 class BC_Instance
可以有多个 BC_InstanceSession
并且 BC_InstanceSession
是 dependent 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 时不会被删除。是否可以指定没有实例的会话不能存在或者我需要手动删除它们?
其次 映射到数据库时似乎有问题。会话在数据库上有两个外键 InstanceID
和 BC_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; }