我正在使用 Entity Framework 5 和 Code First。
我有两个用于测验应用程序的域实体问题和答案。一个问题有几个可能的答案。一个问题也有一个正确的答案,它应该引用一个可能的答案。我在 to 实体之间的一对多和一对一关系的组合中遇到了一些问题。请参阅Q1和Q2。
这是实体的代码:
public class Question
{
public virtual int Id { get; set; }
[Required]
public virtual string Text { get; set; }
[InverseProperty("Question")]
public virtual ICollection<Answer> PossibleAnswers { get; set; }
public virtual Answer CorrectAnswer { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime? UpdateStamp { get; set; }
}
public class Answer
{
public virtual int Id { get; set; }
[Required]
public virtual string Text { get; set; }
[ForeignKey("QuestionId")]
public virtual Question Question { get; set; }
public virtual int QuestionId { get; set; }
}
Q1:我应该怎么做才能在到数据库的一次往返中插入 Question 对象和引用的 Answers(通过属性 PossibleAnswers)(例如,一次调用上下文 SaveChanges)?当我在不先添加答案的情况下保存问题和答案时出现的错误是:
无法确定相关操作的有效排序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。
为了解决这个问题,我尝试了以下使用流利的 API 来获取要在问题之前添加的答案,只需调用 objectcontexts SaveChanges 即可:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Question>()
.HasOptional(q => q.CorrectAnswer)
.WithRequired();
base.OnModelCreating(modelBuilder);
}
但是,这导致我出现另一个错误:
检测到有冲突的更改。当尝试插入具有相同键的多个实体时,可能会发生这种情况。
Q1 的流利 API 方法是否走在正确的道路上?为什么会出现错误信息?
Q2:删除问题时,我意识到会出现错误,因为无法在答案之前删除问题,反之亦然。我该如何解决这个问题?例如,是否应该在 Question.CorrectAnswer 和 Question.PossibleAnswers 上都指定 WillCascadeOnDelete?