1

我遇到了数据库上传脚本的问题。它基本上只是将所有实体从备份源添加到数据库。

但是,由于新数据库的某些字段在旧数据源中不存在,因此我为其分配了默认值。有关示例,请参见下面的屏幕截图,字符串属性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.应该的。

截图2

我知道很多事情都会导致这个异常;但我没有看到这个问题的根本原因。有人可以对此有所了解吗?我不知道为什么会抛出这个异常......

我发现许多具有相同错误的未解决问题,但我认为这是一种不同的情况,因为我的字段不是数据库生成的,也不是 PK 或 IDENTITY 字段。在构造实体时它们不为空,并且正在添加的对象实际上具有正确的值。

更新

我刚刚注意到前 83 个实体已正确添加。异常在第 84 次执行代码时引发(之后很多次。这意味着问题可能在另一个属性字段中。

我检查了所有字段,我遇到的唯一null值被添加到已在数据库和实体框架中设置为可为空的字段中。

现在我真的不明白为什么在描述字段上抛出异常。

更新 2

这个应用程序似乎是由 Salvador Dali 编写的。

我重新编写了代码,但这一次,我注释掉了该.AddObject(temp);行。这意味着实体已创建,但从未添加到 db 上下文中。然后db.SaveChanges();调用实际上应该是多余的并且什么都不做。

或者我虽然。事实证明,我的实体仍在添加中。我逐步完成了整个代码执行,它从不以任何方式使用 db 上下文db.SaveChanges();,但它仍然被添加。相反,如果我只在计数器达到 100 后才开始添加实体(这意味着只有项目 100、101、102 ......将被保存,其余的都不会被添加),它仍然会继续添加其他实体为好。

我一点头绪都没有。字面上没有。一旦我知道更多,我会更新帖子。

最后更新

我设法找到了解决方法(请参阅下面的答案)。但是,我仍在寻找为什么会发生这种情况的解释。如果有人可以向我解释这一点,我将奖励他们这个问题的答案。

4

1 回答 1

0

我设法在代码中更进一步。我改变了操作的顺序。它曾经是:

//1. initialize temp
//2. fill in temp; field by field.
//3. if any missing (required) fields are encountered during step 2, then continue the foreach loop and take the next element (no save)
//4. else, add to database ad save changes

不知何故,我无法解释这一点,实体会自动保存。如果我运行与上面完全相同的代码但没有该.AddObject()功能,它仍然会被添加。

所以我将代码更改为:

//1. Find all fields that will be needed for the entity
//2. If any required field is stille empty, continue the foreach loop
//3. initialize temp (inline initialization with all properties)
//4. Add object and save.

这并不能真正解决原始问题,它只是一种解决方法。如果有人可以向我解释为什么要添加这些实体,我会接受它作为我的问题的解决方案。

于 2012-10-02T07:57:38.087 回答