我对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解决所有这些方便的内置关系集合?
答案 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);
}