2013-03-02 4 views
0

Мне нелегко обернуть голову вокруг этой проблемы: есть ли способ добавить одну запись в ICollection? По одному, сохраняя данные в базе данных для каждой добавленной записи?Добавьте одну запись в ICollection динамически по одному (MVC4 EF)

Вот моя конкретная ситуация:

У меня есть тест Модель:

public partial class Test 
{ 
    public Test() 
    { 
     this.Students = new HashSet<Student>(); 
     this.Questions = new HashSet<Question>(); 
    } 

    public int Id { get; set; } 
    public string name { get; set; } 
    public string description { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
    public virtual ICollection<Question> Questions { get; set; } 
} 

Тестовый содержит набор вопросов. Вопрос Модель:

public partial class Question 
{ 
    public Question() 
    { 
     this.Answers = new HashSet<Answer>(); 
    } 

    public int Id { get; set; } 
    public string query { get; set; } 

    public virtual Test Test { get; set; } 
    public virtual ICollection<Answer> Answers { get; set; } 
} 

Моя цель состоит в том, чтобы пользователь, чтобы иметь возможность создать тест, с именем и описанием, а затем динамически добавлять вопросы к этому испытанию, пока они не будут удовлетворены. На данный момент создание теста прост, но загрузка теста с вопросами доказывает сложность для меня. Я предвидел форму, которая представила бы вопрос и тест. Идлось бы действие контроллера, которое сохраняло бы данные в базе данных. Но я не понимаю, как я могу динамически добавлять вопрос к ICollection теста.

Есть ли способ добавить одну запись в ICollection? Один за раз?

Одна из многих попыток я сделал

Большое спасибо за любую помощь!

В ответ на levelnis: Я попытался это не повезло

public void AddQuestionToTest(Test test, Question question) 
    { 
     question.Test = test; 
     test.Questions.Add(question); 
     Update(test); 
     SaveChanges(); 
    } 

Это не добавляя никаких вопросов к БД. Есть идеи?

EDIT: Единственный код, который я попробовал, что получает вопрос в базе данных:

public void AddQuestionToTest(Test test, Question question) 
{ 
    question.Test = test; 
    Insert(question); 
    SaveChanges(); 
} 

..но это делает еще один тест в базу данных с тем же именем/описанием, но новый id, который был увеличен.

ответ

0

Возможно, мне что-то не хватает, но разве это не сработает?

test.Questions.Add(new Question{ Id = 1, query = "set your question up here" }); 

Вам необходимо будет обновить и сохранить изменения в тесте через EF, чтобы сохранить его обратно в базу данных.

+0

Кажется, я не работаю для меня. Добавлен вопрос, чтобы показать, что я пробовал. – nycfdtd

+0

Вам нужно сначала вставить вопрос, а затем добавить его в тест и обновить? – levelnis

+0

Если я вставил (вопрос). Вопрос сохраняется в базе данных, но он дублирует другой тест с идентификатором, который увеличивается на единицу. Тест имеет то же имя и описание. – nycfdtd

0

Это кажется таким простым пропускает, но вот то, что я делаю неправильно:

я создавал новый тест в базе данных с помощью тестового объекта. Затем я попытался использовать тот же объект для установки Question.Test. Это привело к созданию нового теста, когда я вставил вопрос в базу данных.

После ввода нового теста в базу данных мне пришлось запросить базу данных, чтобы найти этот тест, и назначить этот тест Question.Test.

Кажется странным, потому что он идентичен тесту, который я сохранял, но я думаю, что происходит кое-что за кулисами, о которых я не знаю.

Благодарим вас за выравнивание.Я очень ценю это.

+0

Похоже, вы не получили идентификатор 'test' после его сохранения. Является ли 'Id' первичным ключом в отношении EF? См. Здесь: http://stackoverflow.com/questions/4068084/how-to-find-an-identity-of-the-last-inserted-row-in-entity-framework - 'Insert()' возвращает идентификатор объект, который был вставлен, и ваш 'test' нуждается в свойстве' id', иначе EF будет считать, что это новый объект, и попробуйте снова вставить его – levelnis