Мы используем EF5 и SQL Server 2012 следующие два класса:
public class Question
{
public Question()
{
this.Answers = new List<Answer>();
}
public int QuestionId { get; set; }
public string Title { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
public string Text { get; set; }
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}
Отображение выглядит следующим образом:
public class AnswerMap : EntityTypeConfiguration<Answer>
{
public AnswerMap()
{
// Primary Key
this.HasKey(t => t.AnswerId);
// Identity
this.Property(t => t.AnswerId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
База данных DDL
CREATE TABLE Answer (
[AnswerId] INT IDENTITY (1, 1) NOT NULL,
[QuestionId] INT NOT NULL,
[Text] NVARCHAR(1000),
CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([AnswerId] ASC)
)";
Вот результаты того, что я пробовал:
Это работает для одного ребенка:
var a = new Answer{
Text = "AA",
QuestionId = 14
};
question.Answers.Add(a);
_uow.Questions.Update(question);
_uow.Commit();
Это не работает для более чем одного ребенка:
Ошибка: объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.
var a = new Answer{
AnswerId = 0,
Text = "AAA",
QuestionId = 14
};
var b = new Answer {
AnswerId = 0,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
Это не работает для более чем одного ребенка:
Он создает AnswerID 1000 и 1001, но я хочу, чтобы новый идентификатор был создан базой данных.
var a = new Answer{
AnswerId = 1000,
Text = "AAA",
QuestionId = 14
};
var b = new Answer {
AnswerId = 1001,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
Не работает:
Ошибка компилятора. Невозможно преобразовать null в int
var a = new Answer{
AnswerId = null,
Text = "AAA",
QuestionId = 14
};
var b = new Answer
{
AnswerId = null,
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
Не работает:
ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.
var a = new Answer{
Text = "AAA",
QuestionId = 14
};
var b = new Answer
{
Text = "BBB",
QuestionId = 14
};
question.Answers.Add(a);
question.Answers.Add(b);
_uow.Questions.Update(question);
_uow.Commit();
В моем приложении у меня есть один или несколько новых объектов ответа, сгенерированных на клиенте, а затем они отправляются на сервер. Выше Я имитирую, что произойдет, не добавляя в вопрос вопрос. Обратите внимание, что добавление всех ответов на объект Question выполняется на клиенте, а затем переходит в строку JSON на сервер. Затем он десериализуется на объект вопроса следующим образом:
public HttpResponseMessage PutQuestion(int id, Question question) {
_uow.Questions.Update(question);
_uow.Commit();
Я хочу, чтобы каждый объект Answer был создан с помощью new identity ID
, поскольку они должны быть добавлены к объекту Вопроса и для возвращаемого объекта вопроса обычным способом.
Я не знаю, как это можно сделать. Все мои простые тесты пока не работают. Обратите внимание, что это вариант по более раннему вопросу нашего члена группы, который был менее ясен и который я пытаюсь закрыть. Этот вопрос, я надеюсь, будет более ясным.
Примечания:
Вот как кодируется обновление:
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}