簡體   English   中英

使用EF插入具有多對多關系的操作

[英]Insert operation with many-to-many relationship using EF

我有兩個模型類:

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。

上面的代碼生成了3個表候選人,工作和候選人工作(由EF自動生成)

現在我在Jobs表中記錄:Id = 1,Name =“Sales”:Id = 2,Name =“Engineer”。

我想將一個新的Candidate與Jobs表中的2個記錄關聯到Candidates表中。

在插入候選人之前,我知道了Jobs表的Id,我不想調用數據庫來從Jobs表中獲取更多細節。

如何使用Entity Framework 5執行此操作?

這個怎么樣?

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();

這僅在您已在DbContext的同一實例中從數據庫中提取作業DbContext ,否則EF會認為作業是“新”並嘗試插入它們。 如果您只有ids,可以嘗試以下方法:

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();

有兩種選擇。

如果您要使用相同的上下文和候選對象,則只需將現有候選對象添加到作業中即可。 例如:創建候選人並將其保存到數據庫:

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();

完成!

一個非常簡單的解決方案是創建外部參照表的VIEW,與表(view_tablename_raw)完全相同。 然后在EF中將該視圖更新為沒有外鍵的實體。 從他們的使用上下文 .view_tablename_raw.Add(...),它將無縫地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM