- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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:我应该怎么做才能在一次往返数据库(例如一次调用上下文 SaveChanges)中插入问题对象和引用的答案(通过属性 PossibleAnswers)?在不先添加答案的情况下保存问题和答案时出现的错误是:
Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.
为了解决这个问题,我尝试了以下方法,使用流畅的 API 来获取要在问题之前添加的答案,而这一切只需一次调用 objectcontexts SaveChanges:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Question>()
.HasOptional(q => q.CorrectAnswer)
.WithRequired();
base.OnModelCreating(modelBuilder);
}
但是,这导致我犯了另一个错误:
Conflicting changes detected. This may happen when trying to insert multiple entities with the same key.
第一季度的流畅 API 方法是否走在正确的道路上?为什么会出现错误消息?
Q2:删除问题时我意识到会出现错误,因为问题不能在答案之前删除,反之亦然。我该如何解决这个问题?例如,是否应该在 Question.CorrectAnswer 和 Question.PossibleAnswers 上指定 WillCascadeOnDelete?
最佳答案
对于您的问题 Q1 和 Q2,您将需要两次往返/两次调用 SaveChanges
(除了使用存储过程解决问题之外)。
Q1:第一个调用将 Question.CorrectAnswer
设置为 null
,第二个调用将 CorrectAnswer
设置为存储的答案之一.
问题 2:第一次调用将 Question.CorrectAnswer
设置为 null
,第二次调用删除了 Question
和启用级联删除的相关答案.
如果您不太担心两次往返,而是更担心与两次 SaveChanges
调用相对应的两次交易,您可以包装整个操作,包括两次 SaveChanges
调用成一个单一的手动交易。 (示例:EF: How do I call SaveChanges twice inside a transaction?)
关于一对一关系:尽管从业务角度来看 CorrectAnswer
的关系是一对一的,但很难甚至不可能将其建模为一对一与 EF 的关系。
问题在于 EF 不支持外键一对一关联,即外键(CorrectAnswerId 左右)具有唯一约束的关系。它仅支持共享主键一对一关联,其中依赖项 (Question
) 的主键是主体 (Question.CorrectAnswer
) 的外键 ( 回答
) 同时。您的 Fluent 代码就是这种共享主键关联的配置。但这意味着唯一有效的 CorrectAnswer
是与 Question
具有相同主键值的 Answer
。虽然这在理论上是可能实现的(您的 Answer
表比 Question
表有更多的记录),但很可能需要不使用自动生成的键,而是手动提供键。将 CorrectAnswers
从一个 Answer
更改为另一个是不可能的。因此,在我看来,共享主键不适合您的模型。
更好的解决方案是删除 Fluent 映射。结果将是与 Question
表中的 CorrectAnswer
的可为空外键的一对多关系。从数据库的角度来看,这意味着相同的 Answer
可以是许多 Question
的 CorrectAnswer
,这在您的业务逻辑中可能是无稽之谈,因为每个问题都有它自己独特的一组答案和两个问题永远不会共享相同的答案。但是您可以通过不向 Answer
添加反向集合属性(如 QuestionsThisIsTheCorrectAnswerFor
)来从您的业务逻辑中“隐藏”这种一对多关系。虽然它没有完美地模拟业务约束,但它在技术上没有问题。
有关与 EF 一对一关系的困难的更多信息,请参阅以下博客文章:
关于c# - 如何解决 EF 5 Code First 中组合的一对一和一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14751898/
目前,我正在为网络开发类(class)做作业。 这些是说明:第一行和首字下沉样式Jakob 希望文章的第一行以小写大写字母显示。转到 First Line and Drop Cap Styles 部分
.first() 方法是在 jQuery 1.4 中添加的。 :first 选择器自 1.0 以来就已存在。 来自文档: :first The :first pseudo-class is equiv
我正在审查现有的 ASP.NET MVC (5.2.3) EF (6.1.3) 项目。 该项目使用 ASP.NET Identity,我检查了 web.config 中的 2 个连接字符串,一个用于
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
for(auto it = M.begin(); it!=M.end();it++) { coutfirstsecondsecond == 1) return it->firs
我试图从第二个循环中获取循环的第一项。 我知道我得到了这样的@key @../key 但@first 似乎不像@../first 那样工作 有什么想法吗? 问候 最佳答案 首先,无论是否在嵌套 blo
var tab1 = $('.tabs a:first-child').attr('href'); alert(tab1); .. 尽管同一页面上有两个 div.switch,但仅匹配一个。第二个位于
我想知道如何将节点*变量 NODE 分配给结构内的数据? struct node { int info; struct node *link; }; typedef struct nod
我有两个段落包含在一个 div 中。我想让第一段的文字变大一点,但使用 :first-child 并不能像我所说的那样工作。看不出有什么问题。
我有一个 ul li 列表 Parent child1 child2
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
这有什么区别吗: myList.Where(item => item == 0).First(); 还有这个: myList.First(item => item == 0); 后者对我来说更有意义,
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
当我遇到一个奇怪的情况时,我正在研究 CSS 选择器。 如果我使用 :first-child 伪元素,我需要在它前面加上一个空格才能工作,否则它将无法工作。然而 :first-letter 伪元素的情
请考虑以下字符串数组: let strings = ["str1", "str2", "str10", "str20"] 假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 fil
让我们假设我们要开始新项目 - 包含一些业务逻辑的应用程序、ASP.NET 上的用户界面、WPF 或两者。我们想使用 ORM 或 DAL 代码生成器并在 .NET 类中实现我们的业务逻辑。我们可以通过
我有一种树系统。我想做的是给所有 parent 一个 margin ,除了第一个。这是我的 HTML: Test
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
我是一名优秀的程序员,十分优秀!