Testing framework says entity has no key defined for built in entity
Asked Answered
B

2

8
Castle.Proxies.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.  

I am trying to setup tests for my MVC 5.1 project which uses EntityFramework version 6.1, AspNet.Identity.Core version 2.0, AspNet.Identity.EntityFramework version 2.0. My only test case is very simple and it is erroring with the above error for 'IdentityUserLogin' and for Entity Type 'IdentityUserRole' as soon as I try to run. The problem is that as far as I understand there are keys defined for both of these entities! As they are provided by the framework. I can't see explicitly their description in my code first portion but in the database I can see they both have keys.

In my test project I'm using Microsoft.VisualStudio.TestTools.UnitTesting and Moq (as well as the EF & Identity Core libs).

Any help or just pointing to resources would be much appreciated. I couldn't find anyone having a similar error.

Boatwright answered 7/4, 2014 at 8:45 Comment(0)
B
17

I had the same Problem and was finally able to get the test running by creating the mock as follows:

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

As I understand it, the Mock otherwise does not call base class implementations. And those Keys will probably be defined in the base class implementation of - I guess - OnModelCreating.

Bonesetter answered 14/4, 2014 at 11:30 Comment(2)
Fantastic. Thank you. This CallBase = true addition was all I needed.Boatwright
After adding CallBase = true I've obtained a new error message: There is already an object named 'public' in the database. CREATE SCHEMA failed due to previous errors.Ress
W
0

In the Entity Framework, entities need to have a property (database column) defined as the primary key and it looks like you do not have one in your database (or EF does not properly map it).

To manually define a Key, you can use the Key attribute:

class IdentityUserLogin 
{
    [Key]
    public int IdentityUserLoginId { get; set; }
}
Whiskey answered 7/4, 2014 at 10:36 Comment(1)
I believe this is my problem - the table already does have a key defined. You can see it here msdn.microsoft.com/en-us/library/…. The rest of my application can see this key and those properties without a problem.Boatwright

© 2022 - 2024 — McMap. All rights reserved.