我遇到了数据库上传脚本的问题。它基本上只是将所有实体从备份源添加到数据库。
但是,由于新数据库的某些字段在旧数据源中不存在,因此我为其分配了默认值。有关示例,请参见下面的屏幕截图,字符串属性CCP1_description
(以及下面类似命名的描述)被设置为"Enter description here."
但是,当我保存实体时,我收到一个异常,说明描述字段不允许为 NULL。显然不是。
见截图代码+异常
这是我的数据库创建脚本中的一个片段,它显示了列的设置方式:
...
[CCP1_description] nvarchar(max) NOT NULL,
[CCP2_description] nvarchar(max) NOT NULL,
[EP1_description] nvarchar(max) NOT NULL,
[EP2_description] nvarchar(max) NOT NULL,
[EP3_description] nvarchar(max) NOT NULL,
[EP4_description] nvarchar(max) NOT NULL,
[EP5_description] nvarchar(max) NOT NULL,
...
如果我在调试的时候检查我的temp
变量,我可以清楚地看到描述字段的内容(都是""Enter description here.
应该的。
我知道很多事情都会导致这个异常;但我没有看到这个问题的根本原因。有人可以对此有所了解吗?我不知道为什么会抛出这个异常......
我发现许多具有相同错误的未解决问题,但我认为这是一种不同的情况,因为我的字段不是数据库生成的,也不是 PK 或 IDENTITY 字段。在构造实体时它们不为空,并且正在添加的对象实际上具有正确的值。
更新
我刚刚注意到前 83 个实体已正确添加。异常在第 84 次执行代码时引发(之后很多次。这意味着问题可能在另一个属性字段中。
我检查了所有字段,我遇到的唯一null
值被添加到已在数据库和实体框架中设置为可为空的字段中。
现在我真的不明白为什么在描述字段上抛出异常。
更新 2
这个应用程序似乎是由 Salvador Dali 编写的。
我重新编写了代码,但这一次,我注释掉了该.AddObject(temp);
行。这意味着实体已创建,但从未添加到 db 上下文中。然后db.SaveChanges();
调用实际上应该是多余的并且什么都不做。
或者我虽然。事实证明,我的实体仍在添加中。我逐步完成了整个代码执行,它从不以任何方式使用 db 上下文db.SaveChanges();
,但它仍然被添加。相反,如果我只在计数器达到 100 后才开始添加实体(这意味着只有项目 100、101、102 ......将被保存,其余的都不会被添加),它仍然会继续添加其他实体为好。
我一点头绪都没有。字面上没有。一旦我知道更多,我会更新帖子。
最后更新
我设法找到了解决方法(请参阅下面的答案)。但是,我仍在寻找为什么会发生这种情况的解释。如果有人可以向我解释这一点,我将奖励他们这个问题的答案。