测试框架提示内置实体没有定义键。

8
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库)。
任何帮助或指向资源的指导都将不胜感激。我找不到有人遇到类似的错误。
2个回答

18

我遇到了同样的问题,最终通过创建以下模拟对象,成功运行了测试:

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

据我理解,Mock对象不会调用基类实现。而那些Key可能会在基类的-OnModelCreating实现中定义。


1
太棒了。谢谢你。这个 CallBase = true 的添加就是我所需要的。 - bean
在添加了 CallBase = true 后,我得到了一个新的错误信息:数据库中已经存在名为 'public' 的对象。由于先前的错误,CREATE SCHEMA 失败。 - 1_bug

0
在实体框架中,实体需要有一个属性(数据库列)被定义为主键,看起来你的数据库中没有这样的属性(或 EF 未能正确映射它)。
要手动定义一个主键,可以使用 Key 属性:
class IdentityUserLogin 
{
    [Key]
    public int IdentityUserLoginId { get; set; }
}

我相信这是我的问题 - 表已经定义了一个键。您可以在此处查看http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.entityframework.identityuserlogin(v=vs.111).aspx。我的应用程序的其余部分可以轻松访问此键和这些属性。 - bean

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