10

私は2つのモデルクラスを持っています:

public class Candidate
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<Job> Jobs { get; set; }
}

public class Job
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<Candidate> Candidates { get; set; }
}

私の DbContext 名は JobsContext です。

上記のコードは、Candidates、Jobs、および CandidatesJobs の 3 つのテーブルを生成します (EF によって自動生成されます)。

Jobs テーブルにレコードがあります: Id = 1、Name = "Sales": Id = 2、Name = "Engineer"。

Candidates テーブルに挿入する新しい Candidate を、Jobs テーブルの 2 つのレコードに関連付けたいと考えています。

Candidate を挿入する前に、Jobs テーブルの ID を知っているので、Jobs テーブルから詳細を取得するためにデータベースを呼び出したくありません。

Entity Framework 5 を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

24

これはどう?

Job salesJob; // already fetched from db
Job engineerJob; // already fetched from db

Candidate candidate = new Candidate();
candidate.Name = "John Doe";
candidate.Jobs = new List<Job>(); // you could also do this in the constructor of Candidate
candidate.Jobs.Add(salesJob);
candidate.Jobs.Add(engineerJob);

context.SaveChanges();

これは、 の同じインスタンス内でデータベースからジョブを既に取得している場合にのみ機能します。そうでない場合、DbContextEF はジョブが「新規」であると判断し、それらを挿入しようとします。ID しかない場合は、次のことを試すことができます。

var salesJob = new Job { Id = salesJobId };
var engineerJob = new Job { Id = engineerJobId };

context.Jobs.Attach(salesJob);
context.Jobs.Attach(engineerJob);

candiate.Jobs.Add(salesJob);
candiate.Jobs.Add(engineerJob);
context.SaveChanges();
于 2013-10-02T08:16:06.647 に答える
7

2 つのオプションがあります。

同じコンテキストと候補オブジェクトを配置する場合は、既存の候補オブジェクトをジョブに追加するだけです。例: 候補者を作成し、データベースに保存します。

JobsContext context = new JobsContext();
var candidate1 = new Candidate() { Name = "John Smith" }; //id 1
var candidate2 = new Candidate() { Name = "Jane Smith" }; //id 2
var candidate3 = new Candidate() { Name = "John Doe" }; //id 3
context.Candidates.Add(candidate1);
context.Candidates.Add(candidate2);
context.Candidates.Add(candidate3);
context.SaveChanges();

次に、ジョブを作成します。

var job = new Job() { Name = "Good Job" }; //id 1

最後に、候補者を新しいjob変数に追加し、ジョブをコンテキストに追加して、変更を保存します。

job.Candidates.Add(candidate1);
job.Candidates.Add(candidate2);
context.Jobs.Add(job);
context.SaveChanges();

また

候補を作成したコンテキストとは異なるコンテキストを使用している場合は、新しい候補オブジェクトを作成し、それをジョブに追加する前にコンテキストに添付できます。

//different context from above example
JobsContext newContext = new JobsContext();
//this can be a new or existing job, using the job from the example above here
var existingJob = newContext.Jobs.FirstOrDefault(j => j.Id == 1);

IDのみを設定して候補オブジェクトを作成します

var existingCandidate3 = new Candidate() { Id = 3 };

オブジェクトを新しいコンテキストにアタッチします。 注: 上記の例のコンテキストがまだ残っている場合は、既に候補を追跡しているため、これを行うことはできません。

newContext.Candidates.Attach(existingCandidate3);

新しい候補を作成したくないので、状態を Unchanged に設定します。既存の候補をそのまま使用します。

newContext.Entry(existingCandidate3).State = System.Data.EntityState.Unchanged;

追加して変更を保存します。

existingJob.Candidates.Add(existingCandidate3);
newContext.SaveChanges();

終わり!

于 2013-10-02T07:36:24.293 に答える