2013-03-27 4 views
0

Я в ситуации, когда я импортирую множество записей «ссылок» из файла XML, и я хочу вставить их в таблицу ссылок SQL с помощью Entity Framework. Моя ссылка стол буквально только 2 колонки, оба из которых являются ФКС и составляют ПК:Entity framework - вставка по ID

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

Путь я привык делать вставки включает в себя следующее:

  1. Получить UserAssessment объект от БД для userAssessmentId.
  2. Получить объект Answer из базы данных для answerId.
  3. Добавить объект Answer в категорию UserAssessmentAnswers.
  4. Повторите 2 и 3 для каждого answerId, чтобы добавить.
  5. Звоните context.SaveChanges().

Беда в том, что это чрезвычайно интенсивный DB при добавлении сотен ответов; EF должен получить отчет за каждый ответ он добавляет в таблицу ссылок! Я просто хочу вставить запись с заданным userAssessmentId и данными answerId, а не с трудом получить предмет сначала. EF не нужно беспокоиться о том, являются ли введенные мной идентификаторы действительными; просто предположите, что они есть. Есть ли способ получить 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(); 
} 

EDIT
Вам нужно отключить инициализацию базы данных для нового контекста. В файле конфигурации, добавьте:

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

Или, вы можете добавить следующий код запуска:

Database.SetInitializer<UserAssessmentAnswerContext>(null); 
+0

+1 Звучит как возможное решение. Вероятно, лучше, чем включение соединительной таблицы в основной модели (и потеря многих для многих). –

+0

Я попробовал это решение, и он дает мне «Модель, поддерживающая контекст« UserAssessmentsAnswersContext », изменилась с момента создания базы данных. Подумайте о том, как использовать First First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/? LinkId = 238269) «. когда я пытаюсь добавить объект в контекст. Не знаю, почему. – Jez

+0

OK Я просто попробовал «Add-Migration» в недавно созданном контексте; он хочет отказаться от всего, включая существующую таблицу UserAssessmentsAnswers (предположительно из-за отсутствия ссылок FK в новом контексте) - есть ли какой-либо способ этого? – Jez