3

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

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

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

"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);
4

2 回答 2

0

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

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

于 2015-01-30T10:41:52.717 回答
0

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

在 github 上查看问题

于 2019-03-10T14:52:52.467 回答