2

我对 EF 比较陌生。在我调用 SaveChanges 后,相关的表数据似乎不可用。

假设我有一个包含以下表格的数据库:User、Feature 和 FeatureUser。FeatureUser 将 User 和 Feature 记录联系在一起。我有一个接受 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 解决所有这些方便的内置关系集合?

4

1 回答 1

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);
  }
于 2012-07-31T04:07:49.950 回答