10

我有两个模型类:

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 个表格 Candidates, Jobs & CandidatesJobs(由 EF 自动生成)

现在我在 Jobs 表中有记录:Id = 1,Name =“Sales”:Id = 2,Name =“Engineer”。

我想将要插入到 Candidates 表中的新候选人与 Jobs 表中的 2 条记录相关联。

在插入候选人之前,我知道 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();

这仅在您已经在DbContext. 如果您只有 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

有两种选择。

如果您要放置相同的上下文和候选对象,您可以简单地将现有的候选对象添加到作业中。例如:创建您的候选人并将其保存到数据库中:

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

将状态设置为未更改,因为我们不想创建新的候选人,只需使用现有的候选人。

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

添加它并保存更改。

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

完毕!

于 2013-10-02T07:36:24.293 回答
0

一个非常简单的解决方案是创建与表完全相同的外部参照表的视图 (view_tablename_raw)。然后在 EF 中将该视图更新为没有外键的实体。从他们的使用上下文.view_tablename_raw.Add(...) ,它将无缝工作。

于 2017-07-23T12:08:56.807 回答