0

我正在从 XML 文件中导入大量“链接”记录,并且我想使用实体框架将它们插入到我的 SQL 链接表中。我的链接表实际上只有 2 列,它们都是 FK 并构成 PK:

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

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

  1. 从数据库中获取UserAssessment实体userAssessmentId
  2. 从数据库中获取Answer实体answerId
  3. 将实体添加AnswerUserAssessment实体的Answers集合中。
  4. 重复 2 和 3 为每个answerId添加。
  5. 打电话context.SaveChanges()

问题在于,在添加数百个答案时,这非常耗费数据库;EF 必须获取它添加到链接表的每个答案的记录!我只想插入一条带有 givenuserAssessmentId和 a given的记录answerId,而不是先遇到获取实体的麻烦。EF 不必担心我插入的 ID 是否有效;只是假设他们是。有没有办法让 EF 做到这一点,还是我只需要使用普通 SQL?

4

1 回答 1

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);
于 2013-03-27T18:35:33.470 回答