使用Effort(EF测试工具)和计算列

时间:2015-01-30 08:49:35

标签: database entity-framework c#-4.0 integration-testing effort

我有许多直接访问数据库的集成测试 - 创建测试先决条件对象 - 执行测试然后清理 - 但是我想在内存中尝试相同的方法。

我刚在项目中使用了 Effort ,它非常容易使用。但是,我遇到了一直在尝试的问题 - 但无法解决。

我需要填充虚拟数据的一个表 - 作为测试先决条件 - 包含计算列(nvarchar,not null)。对于测试的范围,我真的不关心该列的值 - 但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到错误:

"Column 'x' cannot be null. Error code: GenericError"

在我的测试中,我使用的是与实际代码相同的edmx文件。这可以防止我不断更新edmx副本。

有没有办法可以强制测试更新edmx(在运行时),以便列是可以为空的非计算列? [覆盖OnModelCreating]还是有办法插入默认值(此列的任何内容)来阻止此错误? [覆盖SaveChanges]

我目前尝试了以下内容:

  • 使用.Attach()代替.Add()
  • 附加对象
  • 添加
  • 后将EntityState设置为Unchanged
  • 通过Entry.OriginalValues强制该值[此实体处于已添加状态时此值]

修改

我尝试重写 OnModelCreating 方法,但无效,因为这是DB-First。

modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);

2 个答案:

答案 0 :(得分:0)

在XML编辑器中打开您的EDMX文件,在StorageModels下找到您的实体, 并添加到列定义StoreGeneratedPattern="Computed"

但是如果您更新或删除并添加该表,您将失去此修改。实际上你可以编写控制台应用程序来更新edmx文件,并在需要的地方添加StoreGeneratedPattern="Computed",你可以将这些应用程序添加到工作室预建事件中。

答案 1 :(得分:0)

问题的原因是Effort数据库中的错误。当计算列基于不可为空的列时,计算列也将自动变为不可为空。因此,Effort数据库期望一个非空值。使用最新更新,此问题已解决。您必须将全局EntityFrameworkEffortManager.UseDefaultForNotNullable标记设置为true。

请参见issue on github