【发布时间】:2018-01-11 19:07:07
【问题描述】:
所以我有这门课:
public class Question
{
public int QuestionId { get; set; }
public string QuestionText { get; set; }
public bool IsInactive { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
还有这个:
public class Answer
{
public Guid AnswerId { get; set; }
public string AnswerText { get; set; }
[Required]
[ForeignKey(nameof(Question))]
public int QuestionId { get; set; }
[Required]
public virtual Question Question { get; set; }
}
使用代码优先的实体框架,一切似乎都按我的预期设置好了。我在Question 和Answer 之间有一对多的关系,删除Question 会导致关联的Answer 消失(我认为)。
现在我想将它添加到Question 类中:
public virtual Answer RightAnswer { get; set; }
我想在Question 和Answer 之间建立一对一的关系(除了来自Answers 和Question 属性的一对多关系),这就是问题所在开始。问题是由于级联删除而发生的。数据库现在看到它的方式,删除问题将删除答案(包括RightAnswer),这将导致它再次尝试删除Question(或者它可能正在删除Answer删除Question,这将然后删除Answer,无论哪种方式)。为了解决这个问题,我需要告诉它 not 级联删除该一对一关系。而且,不幸的是,要做到这一点,我必须深入研究流体 API,在这里我不确定正确的方法。
我有这个:
modelBuilder.Entity<Question>()
.HasRequired(p => p.RightAnswer)
.WithRequiredDependent()
.WillCascadeOnDelete(false);
但我真的不确定这应该是WithRequiredDependant 还是WithRequiredPrinciple。或者如果在这种情况下它甚至很重要。
(是的,我知道另一种解决方案是将IsRight bool 添加到Answer,但现在我想知道是否可以这样做)
【问题讨论】:
-
在一对一的关系中,什么是主体,什么是依赖并不重要。在您的方法中,逻辑会建议要回答的主体是正确答案的问题,因此 .WithRequiredPrinciple() 在您的映射中。但是,我不太确定这在这种情况下是否可行,因为一对一的关系是通过 PK=FK 完成的,并且由于您的实体具有不同的 PK 类型,我不确定 EF 是否能够没有额外的 FK 列的映射。
标签: c# entity-framework