Entity Framework - исключение "Невозможно создать постоянное значение типа ..." - PullRequest
6 голосов
/ 11 сентября 2011

Может кто-нибудь помочь мне разрешить это исключение:

Метод испытания KravmagaTests.Model.Entities.StudentTest.Create_Valid_Student threw исключение: System.NotSupportedException: невозможно создать константу значение типа 'Kravmaga.Models.Account'. Только примитивные типы (такие в этом контексте поддерживаются Int32, String и Guid ').

Я получаю это при запуске этого метода теста:

[TestMethod]
public void Create_Valid_Student()
{
    Student student = new Student()
    {
        Username = "username",
        Firstname = "firstname",
        Surname = "surname",
        Email = "email@gmail.com",
        Password = "password",
    };
    KravmagaContext context = new KravmagaContext();
    context.AddToAccounts(student);
    context.Save();
    bool exists = context.Accounts.Contains(student); // THIS THROWS EXCEPTION
    Assert.IsTrue(exists);
}

Большое спасибо.

Ответы [ 2 ]

9 голосов
/ 11 сентября 2011

Измените свой метод тестирования следующим образом:

// ...
context.Save();
int newStudentId = student.Id;
// because the Id generated by the DB is available after SaveChanges

bool exists = context.Accounts.Any(a => a.Id == newStudentId);
Assert.IsTrue(exists);

Contains здесь не работает, потому что он проверяет, находится ли конкретный экземпляр объекта в наборе context.Accounts. Перевод этой проверки в SQL не поддерживается, только для примитивных типов (как говорит исключение). Any просто переводит указанное выражение фильтра в SQL и передает его в базу данных.

0 голосов
/ 11 сентября 2011

Entity Framework пытается преобразовать context.Accounts.Contains (student) в оператор SQL (например, «WHERE ... IN (...)»). Он не может перевести его в оператор SQL, потому что знает только, как обрабатывать примитивные типы (int, string ...), следовательно, исключение.

Возможно, вы пытаетесь заставить EF сгенерировать оператор SQL, например:

ВЫБРАТЬ * ИЗ СЧЕТОВ, ГДЕ Id IN (1, 2, 3, 4, 5)

Вы можете написать такой оператор LINQ To Entities следующим образом:

 var studentIds = new int[] { 1, 2, 3, 4, 5 };
 var matches = from account in context.Accounts
               where studentIds.Contains(account.Id) 
               select account;

Для получения дополнительной информации посмотрите следующее сообщение в блоге:

http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

В блоге, о котором я упоминал, предлагается обходной путь для платформы .NET 3.5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...