DbContext不实例化导航属性

时间:2012-09-30 05:09:17

标签: c# asp.net .net entity-framework entity-framework-5

我创建了两个具有简单1对多关系的实体。

public class TestEntity
{
    public int Id { get; set; }
    public string Message { get; set; }

    public virtual ICollection<RelatedTest> RelatedTests { get; set; }
}

public class RelatedTest
{
    public int Id { get; set; }
    public bool Something { get; set; }

    public virtual TestEntity TestEntity { get; set; }
}

当我去测试时,ICollection导航属性没有实例化。我无法添加相关实体。

var dataContext = new DataContext();
var testEntity = new TestEntity { Message = "Test message" };
var related = new RelatedTest { Something = true };
testEntity.RelatedTests.Add(related); //fails on this line because RelatedTests is null.
dataContext.TestEntities.Add(testEntity);
dataContext.SaveChanges();

这是预期的功能吗?我是否必须实例化导航属性?我希望Entity Framework为我实例化这个集合。

2 个答案:

答案 0 :(得分:1)

好吧,实体框架不会“初始化”任何对象(除了数据库中的数据)。你必须自己做。 EF仅'将其映射到数据库'。

答案 1 :(得分:1)

在上面的示例中,您可能想要更像

的内容
var dataContext = new DataContext();
var testEntity = new TestEntity { Message = "Test message" };
var related = new RelatedTest { Something = true };
testEntity.RelatedTests = new List<RelatedTest>{related};
dataContext.TestEntities.Add(testEntity);
dataContext.SaveChanges();

因为你正在创建基础实体所以EF还没有在实体上做任何修正。

当您从数据库重新加载此实体时,在上面的示例中,集合不应该为null,因为您似乎正在使用延迟加载。