web-dev-qa-db-ja.com

オブジェクトのリストをefのコンテキストに追加する

Foreach addObjectを使用せずに、エンティティフレームワークのコンテキストにオブジェクトのリストを追加することはできますか?

手伝ってくれてありがとう

29
gruber

一般的にそれを行うことはできません-あなたはループでそれをしなければなりません。ただし、エンティティグラフがあり、親ノードを追加する場合は特に、すべてのオブジェクトの追加を回避できる場合があります。例えば。 Companyのコレクションを持つEmployeesオブジェクトがある場合:

context.AddToCompanies(company);

/* The following loop is not necessary */
/* The employees will be saved together with the company */
/*
foreach (var employee in company.Employees)
{
    context.AddToEmployees(employee);
}*/

context.SaveChanges();
15
Yakimych

EntityFramework 6から DbSet.AddRange Method(IEnumerable) を使用できます

db.companies.AddRange(newCompanies);
34
naveen

Linqといくつかのラムダを使用すると、このように簡単にシードできます。

注:現在のバージョンに関しては、次のことができます

List<Company> companies = new List<Company>();

companies.ForEach(n => context.AddToCompanies(n));

これは私がEntity Framework 4.1以降をコードファーストアプローチで行う方法です

List<RelationshipStatus> statuses = new List<RelationshipStatus>()
{
    new RelationshipStatus(){Name = "Single"},
    new RelationshipStatus(){Name = "Exclusive Relationship"},
    new RelationshipStatus(){Name = "Engaged"},
    new RelationshipStatus(){Name = "Married"},
    new RelationshipStatus(){Name = "Open Relationship"},
    new RelationshipStatus(){Name = "Commited Relationship"}
};

statuses.ForEach(n => myContext.RelationshipStatuses.Add(n));
myContext.SaveChanges();

コンテキストは次のように設定されました

public class MyContext:DbContext
{
     public DbSet<RelationshipStatus> RelationshipStatuses{ get; set; }
}
9
Max Alexander

あなたはナビゲーションプロパティを介してそれを行うことができます。私は同じ問題に遭遇し、ループを使用して気分がよくありませんでした。

StudentテーブルとSubjectテーブルがある場合。 Table StudentとTable Subjectの間には、それぞれ1対多の関係があります。 Studentテーブルのナビゲーションプロパティはpublic IEnumerable<Subject> Subjects {get; set;}、Subjectテーブルのナビゲーションプロパティはpublic Student Student {get;set;}になります。

ループを使用する場合は、ナビゲーションプロパティStudentを使用します。対応するStudentを使用して、SubjectsテーブルのSubjectのすべてのインスタンスを追加する場合は、ナビゲーションプロパティSubjectsを使用します。 。

使い方?オブジェクトをマップする準備ができているとします。つまり、生徒と科目にフィールドを追加したことになります。

現在student.Subjects = subjects' then add student using yourDbContext` [〜#〜] or [〜#〜]上記の@Yakimychの回答で説明したように(コメント付き)。

私はこれをEFではなくEF Core 3.1に実装しました。ただし、EF CoreではなくEFを使用しているものを含め、将来の読者のほとんどはこの回答の恩恵を受けるでしょう。

0
Imran Faruqi