Database 使用计算列的作用力(EF测试工具)
我有许多直接访问DB的集成测试—创建测试先决条件对象—执行测试,然后进行清理—但是我习惯在内存中尝试相同的方法 我刚刚在我的项目中使用了它,它非常容易工作。然而,我遇到了一个问题,我一直在尝试,但无法解决 作为测试的先决条件,我需要用虚拟数据填充其中一个表,其中包含一个计算列(nvarchar,而不是null)。对于测试的范围,我真的不关心该列的值-但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到一个错误:Database 使用计算列的作用力(EF测试工具),database,entity-framework,c#-4.0,integration-testing,effort,Database,Entity Framework,C# 4.0,Integration Testing,Effort,我有许多直接访问DB的集成测试—创建测试先决条件对象—执行测试,然后进行清理—但是我习惯在内存中尝试相同的方法 我刚刚在我的项目中使用了它,它非常容易工作。然而,我遇到了一个问题,我一直在尝试,但无法解决 作为测试的先决条件,我需要用虚拟数据填充其中一个表,其中包含一个计算列(nvarchar,而不是null)。对于测试的范围,我真的不关心该列的值-但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到一个错误: "Column 'x' cannot be null. Error code:
"Column 'x' cannot be null. Error code: GenericError"
在我的测试中,我使用与实际代码相同的edmx文件。这会阻止我不断更新edmx副本
是否有一种方法可以强制测试更新edmx(在运行时),使列成为可为null的非计算列?[overriding on ModelCreating]或者是否有方法插入默认值(此列的任何内容)来停止此错误?[覆盖保存更改]
我目前尝试了以下方法:
- 使用.Attach()而不是.Add()附加对象
- 添加后将EntityState设置为未更改
- 通过Entry.OriginalValues强制值[由于实体处于添加状态,因此此值为]
modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
modelBuilder.Entity().Property(p=>p.x).iso可选().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
在XML编辑器中打开您的EDMX文件,在StorageModels下找到您的实体,
并添加到列定义StoreGeneratedPattern=“Computed”
但是,如果您更新或删除并添加该表,您将失去此修改。实际上,您可以编写控制台应用程序来更新您的edmx文件,并在需要时添加
StoreGeneratedPattern=“Computed”
,您还可以将这些应用程序添加到studio中的预构建事件中。问题的原因是工作数据库中的一个错误。当计算列基于不可为空的列时,计算列也将自动变为不可为空。因此,努力数据库需要一个非空值。通过最新更新,问题得以解决。您必须将全局EntityFrameworkEffortManager.UseDefaultForNotNullable
标志设置为true
请看我想您还没有回答这个问题。模型已经设置为computed。我想要相反的效果-但仅用于测试。因此,我无法删除实际EDMX中的“计算”字段。