1

我想在使用 EF 检索数据的其他实例的数据库中添加一个新实体。我希望使用如下代码:

using (var db = new FundResearchContext(null))
{
    var query = from a in db.As select new 
                {
                    a = a,
                    bs = (from b in db.Bs where b.AnId == a.AnotherId select b)
                };

    var listOfAsAndRelatedBs = query.ToList();
    listOfAsAndRelatedBs[0].bs.Add(new B());
    db.SaveChanges();
}

虽然bs跟踪集合中的对象并保存对它们的更改,但我无法将新项目添加到集合中,因为它的类型是IQueryable. 我意识到在这样一个简单的情况下,我可以将属性放在 A 和 B 上,以表明它们是通过外键链接的,但这种方法在我的现​​实生活场景中是不可能的。那么是否有另一种语法可以使bs自己成为一个被跟踪的对象,我可以向其中添加新B对象并使它们持久化?还是我必须手动使用db.Bs.Add(new B())

4

2 回答 2

1

如果你的A班级有一个Bs收藏,你可以说:

var query = from a in db.As select new 
            {
                a = a,
                bs = a.Bs
            };

这有一个很好的急切加载效果,因为当这个查询实现时B,每个的所有 s 都A被加载并附加。并且您应该能够将对象添加到结果之一的bs属性或属性中。a.Bs

如果您没有在 Entity 类之间建立这种关系,您将无法做到这一点,并且您将无法db.Bs直接添加。当然,您可以创建一种快捷方式对象来促进这一点:

public class DTO {public A a{get;set;} public IObjectSet<B> allBs {get;set;} }

var list = (from a in db.As 
            select new DTO
            {
                a = a,
            }).ToList();
foreach(var a in list)
{
    a.allBs = db.Bs;
}

这样,您不必直接访问上下文即可将项目添加到Bs.

于 2012-07-18T20:58:55.013 回答
0

如果您ToList()在设置bs匿名对象时调用,那么bs应该是类型List<B>

using (var db = new FundResearchContext(null))
{
    var query = from a in db.As select new 
                {
                    // ...
                    bs = (from b in db.Bs 
                          where b.AnId == a.AnotherId 
                          select b)
                         .ToList()
                };
    // ...
}
于 2012-07-18T20:43:39.807 回答