Foreach addObjectを使用せずに、エンティティフレームワークのコンテキストにオブジェクトのリストを追加することはできますか?
手伝ってくれてありがとう
一般的にそれを行うことはできません-あなたはループでそれをしなければなりません。ただし、エンティティグラフがあり、親ノードを追加する場合は特に、すべてのオブジェクトの追加を回避できる場合があります。例えば。 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();
EntityFramework 6から DbSet.AddRange Method(IEnumerable) を使用できます
db.companies.AddRange(newCompanies);
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; }
}
あなたはナビゲーションプロパティを介してそれを行うことができます。私は同じ問題に遭遇し、ループを使用して気分がよくありませんでした。
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 your
DbContext` [〜#〜] or [〜#〜]上記の@Yakimychの回答で説明したように(コメント付き)。
私はこれをEFではなくEF Core 3.1に実装しました。ただし、EF CoreではなくEFを使用しているものを含め、将来の読者のほとんどはこの回答の恩恵を受けるでしょう。