我有许多直接访问数据库的集成测试 - 创建测试先决条件对象 - 执行测试然后清理 - 但是我想在内存中尝试相同的方法。
我刚在项目中使用了 Effort ,它非常容易使用。但是,我遇到了一直在尝试的问题 - 但无法解决。
我需要填充虚拟数据的一个表 - 作为测试先决条件 - 包含计算列(nvarchar,not null)。对于测试的范围,我真的不关心该列的值 - 但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到错误:
"Column 'x' cannot be null. Error code: GenericError"
在我的测试中,我使用的是与实际代码相同的edmx文件。这可以防止我不断更新edmx副本。
有没有办法可以强制测试更新edmx(在运行时),以便列是可以为空的非计算列? [覆盖OnModelCreating]还是有办法插入默认值(此列的任何内容)来阻止此错误? [覆盖SaveChanges]
我目前尝试了以下内容:
修改
我尝试重写 OnModelCreating 方法,但无效,因为这是DB-First。
modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
答案 0 :(得分:0)
在XML编辑器中打开您的EDMX文件,在StorageModels下找到您的实体,
并添加到列定义StoreGeneratedPattern="Computed"
。
但是如果您更新或删除并添加该表,您将失去此修改。实际上你可以编写控制台应用程序来更新edmx文件,并在需要的地方添加StoreGeneratedPattern="Computed"
,你可以将这些应用程序添加到工作室预建事件中。
答案 1 :(得分:0)
问题的原因是Effort数据库中的错误。当计算列基于不可为空的列时,计算列也将自动变为不可为空。因此,Effort数据库期望一个非空值。使用最新更新,此问题已解决。您必须将全局EntityFrameworkEffortManager.UseDefaultForNotNullable
标记设置为true。