【问题标题】:Unit Testing Entity Framework NOT Code First. "EntityType has no key defined" for Composite Keys单元测试实体框架不是代码优先。复合键的“EntityType 没有定义键”
【发布时间】:2013-01-15 21:07:53
【问题描述】:

我正在使用实体框架,试图测试命中它的代码。所有代码都运行良好,但我在测试时遇到了问题。当我在测试时运行这段代码时:

_entities = new Mock<MyEntities>();
Database.SetInitializer(new DropCreateDatabaseAlways<MyEntities>());
_entities.Object.Database.Initialize(true);

我收到“EntityType has no key defined”错误。我之前得到这些是因为某些表不遵循将其 id 列命名为“ID”或“[Table Name]ID”的约定。清理完这些后,我仍然可以将它们用于具有复合键的表。就 SQL 而言,它们的定义是正确的。在 EDMX 设计器中,当我单击列时,它们说它们是键。那么如何正确地将它们定义为键呢?代码放在哪里?

我尝试查找此内容,所有引用都专门针对 Code First 实现。反正我试过了。他们说要覆盖 DbContext 对象的 OnModelCreating 方法并将其添加到其中:

modelBuilder.Entity<Widgets>().HasKey(widget => new { widget.A, widget.B });

所以我创建了一个部分类并尝试覆盖它。它已经被覆盖了。所以我去了生成的部分类。这是实现:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

所以这是不对的。那我现在该怎么办?

我想在我的 Web 项目中基于 EDMX 生成一个测试数据库,以便创建适当的集成测试。提前致谢。

【问题讨论】:

    标签: .net integration-testing entity-framework-5


    【解决方案1】:

    如果您使用的是 EDMX,则不能使用数据库初始化(或 onmodelcreating)。这些功能是 Code First 特有的。

    所以这里真的没有答案,因为您无法从 EDMX 生成测试数据库。

    您可以遵循一些模式来动态创建测试数据库。粘贴我在 2009 年写的一篇博文 (http://thedatafarm.com/blog/data-access/unit-testing-in-ef-v1-the-database-conundrum/)

    • 复制/粘贴数据库:使用小型 SQL Server Express 数据库作为 测试数据库。在特定测试过程中,复制/粘贴 db 文件到特定位置,然后打开到它的连接。 在测试结束时,吹掉文件。

    • 事务:在每个数据库访问测试中,将代码包装在一个 System.Transaction.TransactionScope。在测试结束时,不要 完成事务,数据库将回滚。

    • 数据库脚本: 另一个客户正在使用他将在其上生成的小型数据库 在每次测试开始时飞,然后在结束时删除数据库。

    因此,定义密钥的位置(正如我在推特上建议的那样)在您的模型中。在设计器中,右键单击属于该键的每个实体属性,并确保在上下文菜单上单击“实体键”。然后 EF 将使用这些属性的组合作为它的复合实体键。

    希望对你有帮助。

    【讨论】:

    • 我制作了一个 sdf,当我开始测试时我会重新生成它。我的测试项目的 app.config 中的连接字符串指向 sdf 文件。我的所有属性都在我的 EDMX 中标记为键,但它仍然没有得到它。它仍然说它无法识别具有复合键的实体的键。有什么想法吗?
    • 为什么不开始一个新项目来测试从这个数据库再次创建模型。那应该识别复合键。将设计器中的实体与您遇到问题的模型中的实体进行比较。
    • 我刚刚在那些名为 ID 的表中创建了新列,将其设为主键并将另一个复合键设为唯一索引。问题解决了,头疼了。最后回到生产力。不过,谢谢你的帮助,朱莉。作为一个准名人并没有阻止你帮助社区。惊人的。喜欢你在 MSDN 杂志之类的文章。
    • “准著名”。哈哈。好吧,这都是相对的,所以强调“准”;)我不知道该解决方案是否会长期有效,但很难确切知道发生了什么。留意那些钥匙,以免它们在路上咬你。也许您可以运行一些测试以确保它们继续正常运行。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2012-09-02
    相关资源
    最近更新 更多