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 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それぞれのすべてのが読み込まれ、添付されるため、これには優れた遅延読み込み効果があります。そして、結果の1つのプロパティまたはプロパティのAいずれかにオブジェクトを追加できるはずです。bsa.Bs

エンティティクラス間にこの関係を設定していない場合、これを行うことはできず、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()設定するときに呼び出す場合は、次のタイプである必要がありますbsbsList<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 に答える