在Code First EF中声明List而不是ICollection的效果是什么?

时间:2016-03-28 17:40:46

标签: c# entity-framework ef-code-first ef-fluent-api

通常,当我宣布一对多的关系时,我会使用 ICollection ,如下所示。

public class Thong
{
  public Guid Id { get; set; }
  public ICollection<Thing> Things { get; set; }
}

public class Thing
{
  public Guid Id { get; set; }
  public Thong Thong { get; set; }
}

这是自动完成的,不考虑假设等等。但是,我现在开始思考,我无法确定以下更改会在设置中发生什么变化。我已经对它进行了迁移,但据我所知,数据库没有区别。

model.Entity<Thing>()
  .HasRequired(_ => _.Thong)
  .WithMany(_ => _.Things)
  .Map(_ => _.MapKey("ThongId"));

public class Thong
{
  public Guid Id { get; set; }
  public List<Thing> Things { get; set; }
}

public class Thing
{
  public Guid Id { get; set; }
  public Thong Thong { get; set; }
}

我怀疑的一件事是我刚刚杀死了延迟加载所以相关事物的所有实例都将被用于每个丁字裤的检索。是这样吗?我很确定它是。

我的实际问题是,除了现在急切地填充的列表之外,还会有什么改变。

1 个答案:

答案 0 :(得分:4)

将您的属性声明为ICollection<T>List<T>与延迟加载没有任何共同之处 - 它是控制您的属性是否可以延迟加载的virtual修饰符。

不同之处在于,通过将属性声明为List<T>,您正在强制EF在加载时创建并填充具体类(或从该具体类派生的类)你的实体(懒惰或渴望)。当声明为ICollection<T>时,EF可以使用一些内部数据结构填充它,T[]HashSet<T>等,即实现ICollection<T>的任何类。

例如,将您的变体用于ICollection,请尝试使用此类

var result = db.Thong.Include(thong => thong.Things).ToList();

并检查Things成员的实际类型。您会看到它是HashSet<Thing>,而不是List<Thing>