【问题标题】:Testing framework says entity has no key defined for built in entity测试框架说实体没有为内置实体定义键
【发布时间】:2014-04-07 08:45:38
【问题描述】:
Castle.Proxies.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.  

我正在尝试为我的 MVC 5.1 项目设置测试,该项目使用 EntityFramework 6.1 版、AspNet.Identity.Core 2.0 版、AspNet.Identity.EntityFramework 2.0 版。我唯一的测试用例非常简单,一旦我尝试运行,它就会出现上述“IdentityUserLogin”和实体类型“IdentityUserRole”的错误。问题是,据我了解,这两个实体都定义了键!因为它们是由框架提供的。我无法在我的代码第一部分明确看到它们的描述,但在数据库中我可以看到它们都有键。

在我的测试项目中,我使用的是 Microsoft.VisualStudio.TestTools.UnitTesting 和 Moq(以及 EF 和 Identity Core 库)。

任何帮助或只是指向资源将不胜感激。我找不到任何有类似错误的人。

【问题讨论】:

    标签: c# entity-framework unit-testing asp.net-mvc-5.1


    【解决方案1】:

    我遇到了同样的问题,最终能够通过创建模拟来运行测试,如下所示:

    var mockContext = new Mock<MyDbContext>() { CallBase = true };
    

    据我了解,Mock 不会调用基类实现。这些 Key 可能会在 - 我猜 - OnModelCreating 的基类实现中定义。

    【讨论】:

    • 太棒了。谢谢你。我只需要这个 CallBase = true 加法。
    • 添加CallBase = true后得到新的错误信息:There is already an object named 'public' in the database. CREATE SCHEMA failed due to previous errors.
    【解决方案2】:

    在实体框架中,实体需要有一个属性(数据库列)定义为主键,而您的数据库中似乎没有属性(或者 EF 没有正确映射它)。

    要手动定义一个Key,可以使用Key属性:

    class IdentityUserLogin 
    {
        [Key]
        public int IdentityUserLoginId { get; set; }
    }
    

    【讨论】:

    • 我相信这是我的问题 - 该表已经定义了一个键。你可以在这里看到它msdn.microsoft.com/en-us/library/…。我的应用程序的其余部分可以毫无问题地看到这个键和那些属性。
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多