我们正在使用 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,但我希望数据库创建新的 ID。
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();
在我的应用程序中,我在客户端生成了一个或多个新的 Answer 对象,然后将它们发送到服务器。上面我正在模拟在不将客户添加到问题中的情况下会发生什么。请注意,向 Question 对象添加所有 Answers 是在客户端完成的,然后以 JSON 字符串的形式传递给服务器。然后将其反序列化为一个问题对象,如下所示:
public HttpResponseMessage PutQuestion(int id, Question question) {
_uow.Questions.Update(question);
_uow.Commit();
我希望使用 a 创建每个 Answer 对象new identity ID
,以便将这些对象添加到 Question 对象中,并以正常方式返回 Question 对象。
我不知道如何做到这一点。到目前为止,我所有的简单测试都不起作用。请注意,这是我们小组成员之前提出的问题的一个变体,这个问题不太清楚,我正试图结束。这个问题我希望更清楚。
笔记:
以下是更新的编码方式:
public virtual void Update(T entity)
{
DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
DbSet.Attach(entity);
}
dbEntityEntry.State = EntityState.Modified;
}