我正在使用EF 4.1构建应用程序,我想知道为EF应用程序提供服务的底层数据库是否会进入不一致状态。我的意思是,在创建/修改/删除实体期间发生异常的情况下,EF可能会被破坏并将一些不应为null的值保留为null并保存数据库的某些部分。 (特别是在EF上下文中出现异常的情况下)。
让我举个例子:
我有两个独立的实体类型,A和B,A和B有1-1关联。我创建对象A,并在创建B期间出现问题并引发异常。之后,无论如何都要调用上下文的SaveChanges
方法。 (这只是一个例子,可能存在其他关联类型,继承权等等)是否可能发生损坏,或者是否存在可防止不一致的层。肯定应该有SQL服务器约束和空检查。但是我启动了数据库,有时,我得到一个例外,告诉某些(关联)不能为空定义为不可为空,实际上是null,并且因为我没有处理该值为null(想象与前面的示例,引用A.B
为空),我的应用程序/网站崩溃。可能是什么原因?有没有其他应用程序或实例以任何方式访问数据库。最近我发生了这种角落案件,我想知道其根本原因。
答案 0 :(得分:1)
DbContext.SaveChanges()将生成的SQL语句包装在事务中。所以要么eveything得到承诺,要么被回滚。您可能想要检查数据库中的关系和约束。还可以使用Sql Server探查器来查看实际发送到您的数据库的内容可能会有所帮助。