使用Effort(EF Testing Tool)和计算列

4
我有许多集成测试直接访问数据库——创建测试前提对象——执行测试,然后进行清理。但是我想尝试在内存中使用相同的方法。
我刚刚在我的项目中使用了Effort,它非常容易使用。但是我遇到了一个问题,我一直在尝试解决,但无法解决。
其中一个表需要用虚拟数据填充,作为测试前提条件,并包含一个计算列(nvarchar,非空)。对于测试的范围,我真的不关心该列的值,但即使我尝试插入虚拟数据,我的数据也会被忽略,然后我会遇到错误:
"Column 'x' cannot be null. Error code: GenericError"

在我的测试中,我使用与实际代码相同的edmx文件。这样可以避免我不断更新edmx副本。
是否有办法强制测试在运行时更新edmx,以便该列是可空的非计算列?[覆盖OnModelCreating]或者是否有方法插入一个默认值(对于这一列任何值都可以)来停止这个错误?[覆盖SaveChanges]
我目前尝试了以下内容:
- 使用.Attach()而不是.Add()来附加对象 - 在添加后将EntityState设置为Unchanged - 通过Entry.OriginalValues强制值[因为实体处于Added状态]
编辑:
我已经尝试重写OnModelCreating方法,但由于这是DB-First,所以没有效果。
modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
2个回答

0

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

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


我认为你没有理解这个问题。模型已经设置为计算的。我想要相反的效果 - 但仅用于测试。因此,我不能在实际的EDMX中删除“计算”字段。 - Zuiq Pazu

0
问题的原因是Effort数据库中存在一个错误。当计算列基于非空列时,计算列也会自动变为非空列。因此,Effort数据库期望一个非空值。最新更新已解决该问题。您需要将全局EntityFrameworkEffortManager.UseDefaultForNotNullable标志设置为true。

请参见github上的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接