我有许多直接访问数据库的集成测试 - 创建测试先决条件对象 - 执行测试然后清理 - 但是我想在内存中尝试相同的方法。
我刚刚使用了 Effort 在我的项目中,它工作起来非常容易。但是,我遇到了一个我一直在尝试但无法解决的问题。
我需要用虚拟数据填充的其中一个表(作为测试先决条件)包含计算列(nvarchar,非空)。对于测试范围,我真的不关心该列的值 - 但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到错误:
"Column 'x' cannot be null. Error code: GenericError"
在我的测试中,我使用与实际代码使用的相同的 edmx 文件。这使我无法不断更新 edmx 副本。
有没有一种方法可以强制测试更新 edmx(在运行时),以便该列是可为 null 的非计算列? [覆盖 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);
最佳答案
在 XML 编辑器中打开您的 EDMX 文件,在 StorageModels 下找到您的实体,
并添加到列定义 StoreGeneratedPattern="Computed"
。
但是如果您更新或删除并添加该表,您将丢失此修改。实际上,您可以编写控制台应用程序来更新您的 edmx 文件并在需要的地方添加 StoreGeneratedPattern="Computed"
,然后您可以将这些应用程序添加到工作室中的预构建事件中。
关于database - 将 Effort(EF 测试工具)与计算列结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232210/