【发布时间】:2013-02-07 13:09:48
【问题描述】:
我正在使用 Entity Framework 5 和 Code First。
我有两个域实体 Question 和 Answer 用于测验应用程序。一个问题有几个可能的答案。一个问题也有一个正确的答案,它应该引用一个可能的答案。我在 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)?当我在不先添加答案的情况下保存问题和答案时出现的错误是:
无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。
为了解决这个问题,我尝试了以下方法,使用 fluent API 在问题之前添加答案,只需调用 objectcontexts SaveChanges 即可:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Question>()
.HasOptional(q => q.CorrectAnswer)
.WithRequired();
base.OnModelCreating(modelBuilder);
}
但是,这导致我犯了另一个错误:
检测到有冲突的更改。尝试插入具有相同键的多个实体时可能会发生这种情况。
我在第一季度使用流畅的 API 方法是否走在正确的道路上?为什么会出现错误消息?
Q2:删除问题时,我意识到会出现错误,因为无法在答案之前删除问题,反之亦然。我该如何解决这个问题?例如,是否应该在 Question.CorrectAnswer 和 Question.PossibleAnswers 上都指定 WillCascadeOnDelete?
【问题讨论】:
标签: c# ef-code-first entity-framework-5 .net-4.5