实体框架 - 按ID插入

时间:2013-03-27 17:04:56

标签: entity-framework bulkinsert

我正处于从XML文件导入大量“链接”记录的情况,我想使用Entity Framework将它们插入到我的SQL链接表中。我的链接表实际上只有2列,这两列都是FK并构成PK:

[UserAssessmentId] [int] NOT NULL
[AnswerId] [int] NOT NULL

我习惯于插入的方式涉及以下内容:

  1. UserAssessment
  2. 的数据库中获取userAssessmentId实体
  3. Answer
  4. 的数据库中获取answerId实体
  5. Answer实体添加到UserAssessment实体的Answers集合。
  6. 为每个answerId重复2和3以添加。
  7. 致电context.SaveChanges()
  8. 麻烦的是,当添加数百个答案时,这是非常DB密集的; EF必须获取每个答案的记录,它正在添加到链接表中!我只想插入一个给定userAssessmentId和给定answerId的记录,而不是先解决实体获取问题。 EF不用担心我插入的ID是否有效;只是假设他们是。有没有办法让EF做到这一点,还是我只需要使用纯SQL?

1 个答案:

答案 0 :(得分:2)

最简单的选择可能是创建一个单独的上下文和一个简单的实体来表示你的链接表。

[Table("Name of the link table")]
public class UserAssessmentAnswer
{
   public int UserAssessmentId { get; set; }
   public int AnswerId { get; set; }
}

public class UserAssessmentAnswerContext : DbContext
{
   public UserAssessmentAnswerContext() 
      : base("Connection string for the real context")
   {
   }

   public IDbSet<UserAssessmentAnswer> UserAssessmentAnswers
   {
      get { return Set<UserAssessmentAnswer>(); }
   }
}

然后您可以使用新的上下文和实体来插入数据:

using (var context = new UserAssessmentAnswerContext())
{
   context.UserAssessmentAnswers.Add(new UserAssessmentAnswer
   {
      UserAssessmentId = ...,
      AnswerId = ...
   });
   ...
   context.SaveChanges();
}

修改
您需要关闭新上下文的数据库初始化。在配置文件中,添加:

<entityFramework>
   <contexts>
      <context 
         type="YourNamespace.UserAssessmentAnswerContext, YourAssembly" 
         disableDatabaseInitialization="true"
      />
   </contexts>
</entityFramework>

或者,您可以将以下代码添加到您的启动中:

Database.SetInitializer<UserAssessmentAnswerContext>(null);