我遇到了数据库uploadscript的问题。它基本上只是将备份源中的所有实体添加到数据库中。
但是,由于新数据库中的某些字段在旧数据源中不存在,因此我为它们分配了默认值。请参阅下面的屏幕截图以获取示例,字符串属性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.SaveChanges();
调用实际上应该是多余的,根本不做任何事情。
或者我也是。事实证明,我的实体仍然被添加。我完成了整个代码执行,除了db.SaveChanges();
之外,它从不以任何方式使用db上下文,但它仍然被添加。
相反,如果我只在计数器达到100之后才开始添加实体(这意味着只保存项目100,101,102,...将保存,其余部分将不会被添加),它继续将其他实体添加为好。
我根本不知道。字面上没有。我知道更多后,我会更新帖子。
最终更新
我设法找到了解决方法(请参阅下面的答案)。但是,我仍然在寻找解释为什么会发生这种情况的原因。如果有人能向我解释,我会给他们这个问题的答案。
答案 0 :(得分: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.
这并没有真正解决原始问题,它只是一种解决方法。如果有人能够向我提供解释为什么要添加这些实体,我会认为这是我问题的解决方案。