实体框架4.1在SaveChanges之后不加载关系?

时间:2012-07-31 01:37:10

标签: entity-framework entity-framework-4.1

我对EF比较新。在我调用SaveChanges之后,似乎没有相关的表数据。

假设我有一个包含以下表格的数据库:User,Feature和FeatureUser。 FeatureUser将用户和功能记录绑定在一起。我有一个接受Feature对象的方法,它使用基于FeatureUser表的User.name值填充列表。这很好用:

using (var db = new projectModel())
{
  feature f = db.features.First();
  populateList(f);
}

private void populateList(feature f)
{
  foreach(featureuser fu in f.featureusers)
    addToList(fu.user.name);
}

上面代码中的重点是我通过FeatureUser表的内置链接返回到User.name值,返回到User表。什么是行不通的是创建新的FeatureUser记录,然后保存它们,然后尝试遵循相同的过程:

using (var db = new projectModel())
{
  feature f = db.features.First();
  foreach(int newuserid in somearray)
  {
    featureuser nfu = new featureuser();
    nfu.featureid = f.id;
    nfu.userid = newuserid;
    f.featureusers.add(nfu);
  }
  db.SaveChanges();
  populateList(f); // null reference error on fu.user.name
}

一旦我建立并保存了创建关系所需的外键,有没有办法告诉EF解决所有这些方便的内置关系集合?

1 个答案:

答案 0 :(得分:9)

EF返回的实体实例实际上是代理。它们包含延迟加载导航属性的逻辑。但是当你新建featureuser实例时,它没有那个逻辑,因为它没有那个延迟加载逻辑。

因此,让EF创建一个代理实例。

  foreach(int newuserid in somearray)
  {
    //create proxy instance
    var nfu = db.featureusers.Create();

    nfu.featureid = f.id;
    nfu.userid = newuserid;
    f.featureusers.add(nfu);
  }