Платформа тестирования говорит, что у объекта нет ключа, определенного для встроенного объекта

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).

Любая помощь или просто указание на ресурсы будут высоко оценены. Я не мог найти никого с подобной ошибкой.


person bean    schedule 07.04.2014    source источник


Ответы (2)


У меня была та же проблема, и я наконец смог запустить тест, создав макет следующим образом:

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

Насколько я понимаю, в противном случае Mock не вызывает реализации базового класса. И эти ключи, вероятно, будут определены в реализации базового класса, я думаю, OnModelCreating.

person Andreas Pircher    schedule 14.04.2014
comment
Фантастический. Спасибо. Это дополнение CallBase = true было всем, что мне было нужно. - person bean; 15.04.2014
comment
После добавления CallBase = true я получил новое сообщение об ошибке: There is already an object named 'public' in the database. CREATE SCHEMA failed due to previous errors. - person 1_bug; 17.06.2020

В Entity Framework сущности должны иметь свойство (столбец базы данных), определенное как первичный ключ, и похоже, что у вас его нет в вашей базе данных (или EF неправильно сопоставляет его).

Чтобы вручную определить ключ, вы можете использовать атрибут Key:

class IdentityUserLogin 
{
    [Key]
    public int IdentityUserLoginId { get; set; }
}
person nXu    schedule 07.04.2014
comment
Я считаю, что это моя проблема - в таблице уже определен ключ. Вы можете увидеть это здесь ">msdn.microsoft.com/en-us/library/. Остальная часть моего приложения может видеть этот ключ и эти свойства без проблем. - person bean; 07.04.2014