2013-03-27 45 views
0

我處於從XML文件導入大量「鏈接」記錄的情況,並且我想使用實體框架將它們插入到我的SQL鏈接表中。我的鏈接表是從字面上只有2列,這兩者都是FKS和構成PK:實體框架 - 按ID插入

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

我已經習慣了做插入的方式包括以下內容:

  1. 從獲取UserAssessment實體數據庫爲userAssessmentId
  2. answerId獲取DB的Answer實體。
  3. Answer實體添加到UserAssessment實體的Answers集合中。
  4. 重複2和3爲每個answerId添加。
  5. 致電context.SaveChanges()

麻煩的是,當添加數以百計的答案時,這是非常密集的數據庫; EF必須獲得的記錄,每個回答它正在添加到鏈接表!我只想插入一個給定的userAssessmentId和給定的answerId的記錄,而不是經歷首次獲得實體的麻煩。 EF不必擔心我插入的ID是否有效;只是假設他們是。有沒有辦法讓EF來做到這一點,或者我需要使用普通的SQL?

回答

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

+1聽起來像一個可行的解決方案。可能比在主模型中合併交接表更好(並且失去許多至多個)。 – 2013-03-27 21:25:16

+0

我試過這個解決方案,它給了我「自從創建數據庫以來,支持'UserAssessmentsAnswersContext'上下文的模型已經發生了變化。考慮使用Code First Migrations來更新數據庫(http://go.microsoft.com/fwlink/? LINKID = 238269)「。當我嘗試添加一個實體到上下文。不知道爲什麼。 – Jez 2013-03-28 10:23:32

+0

好吧,我只是在新創建的上下文中嘗試了一個'Add-Migration';它想要放棄一切,包括現有的'UserAssessmentsAnswers'表(可能是因爲在新環境中缺少FK引用) - 是否有解決方法? – Jez 2013-03-28 10:27:12