Проблема с Entity SQL - PullRequest
       39

Проблема с Entity SQL

1 голос
/ 08 июня 2011

Я изучаю Entity Framework 4 из книги.

И я пытаюсь сделать несколько запросов с помощью Entity SQL следующим образом:

using (var context = new BAEntities())
{                
    string str = "SELECT VALUE c " +
                 "FROM BAEntities.Contacts " +
                 "AS c " +
                 "WHERE c IS NOT OF(BAModel.Customer)";

    ObjectQuery<Contact> qry = context.CreateQuery<Contact>(str);

    Console.WriteLine(qry.Count());
}

Цель моего запроса - взять все объекты типа контакта, но не типа клиента. Где Клиент наследует от Контакта

Но я получил следующую ошибку:

Тип 'BAModel.Customer' не найден. Убедитесь, что необходимые схемы загружены и что пространства имен импортированы правильно. Рядом с именем типа, строка 1, столбец 64.

Но, если я сделаю запрос с LINQ to Entities, как это:

ObjectQuery<Contact> qry = context.Contacts.Where(c => !(c is Customer));

тогда программа может работать правильно.

Итак, почему в Entity SQL BAModel.Customer не найдено, тогда как я запускал код в том же проекте, в котором находится модель.

Пожалуйста, помогите мне в этом.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 09 июня 2011

Оказывается, я использую неправильное пространство имен. Правильное полное имя - BAGA.Customer, а не BAModel.Customer. Правое пространство имен - это пространство имен классов, сгенерированных из Model (пространство имен классов в Model1.Designer.cs), а не пространство имен Model.

0 голосов
/ 24 октября 2011

Попробуйте:

_ObjectContext.MetadataWorkspace.LoadFromAssembly(Assembly.GetAssembly(typeof(BAModel.Customer)));

перед запуском команды CreateQuery.надеюсь, это поможет.

0 голосов
/ 08 июня 2011

Рекомендуется использовать EntityCommand вместо ObjectContext.CreateQuery.

Попробуйте это:

using (EntityConnection conn = new EntityConnection("name=MyEntities"))
{
    string str = "SELECT VALUE c " +
                 "FROM BAEntities.Contacts " +
                 "AS c " +
                 "WHERE c IS NOT OF(BAModel.Customer)";
    using (EntityCommand cmd = new EntityCommand(str, conn))
    {                    
        using (var reader = cmd.ExecuteReader())
        {                        
            while (reader.Read())
            {
                Console.WriteLine(reader["c"]);
            }
        }
    }
}

Этот аналогичный вопрос / ответ имеет корень проблемы:

Если ваш запрос выполняется с помощью EntityCommand, тип данных является типом EDM. Если запрос выполняется с помощью ObjectQuery, тип данных является типом CLR.

...