1

Мы планируем обновить с EF4.2 до 6 и испытываем проблемы с функциональностью, которая работала в 4.2.Выполнение OPENQUERY Синтаксис с DbContext.Database.SqlQuery <T> в Entity Framework 6.0

SELECT emp_no_alpha as EmployeeNumber, code_user_1 as Code1, emp_name as EmployeeName FROM OPENQUERY(EMS02, 'select emp_no_alpha, code_user_1, emp_name from dce_mms where emp_no_alpha ='' 100393'' ') 

Мы используем приведенное выше утверждение в сочетании с dbContext.Database.SqlQuery ($ SQL-STMT) для извлечения объектов. Это отлично работает против этой модели в 4.2:

public abstract class Model_XX_EMS_DCEMMS 
    { 
     //LEN=9, RIGHT PAD 
     [Column("EMP_NO_ALPHA", Order = 0), Key(), DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public string EmployeeNumber { get; set; } 

     //LEN=5, RIGHT PAD 
     [Column("CODE_USER_1")] 
     public string Code1 { get; set; } 

     [Column("EMP_NAME")] 
     public string EmployeeName { get; set; } 
    } 

Однако в 6.0, SQL Profiler не пытается на самом деле создать таблицу Model_XX_EMS_DCEMMS внутри каталога по умолчанию и никогда не выполняет оператор выбора, поэтому возвращение нуля.

Это то, что происходит в 6.0:

SELECT Count(*) 
FROM INFORMATION_SCHEMA.TABLES AS t 
WHERE t.TABLE_TYPE = 'BASE TABLE' 
    AND (t.TABLE_SCHEMA + '.' + t.TABLE_NAME IN ('dbo.Model_XX_EMS_DCEMMS') 
     OR t.TABLE_NAME = 'EdmMetadata') 
CREATE TABLE [dbo].[Model_XX_EMS_DCEMMS] (
    [EMP_NO_ALPHA] [nvarchar](128) NOT NULL, 
    [CODE_USER_1] [nvarchar](max), 
    [EMP_NAME] [nvarchar](max), 
    [Discriminator] [nvarchar](128) NOT NULL, 
    CONSTRAINT [PK_dbo.Model_XX_EMS_DCEMMS] PRIMARY KEY ([EMP_NO_ALPHA]) 
) 

Есть ли новая конфигурация DbContext или некоторые атрибуты, которые я пропавшими без вести?

ответ

1

Entity Framework создает таблицу с колонкой дискриминатора для поддержки Table Per Hierarchy inheritance

Но с OPENQUERY вы не хотите эту таблицу. Для того, чтобы остановить EF создание таблицы, что для абстрактного класса вам нужно будет Table Per Type или Table Per Concrete Type

Я не знаю много ничего о OPENQUERY. Не могли бы вы создать представление, которое EF может использовать для поддержки абстрактного класса в TPT? Затем добавьте атрибуты таблицы в таблицы, которые наследуют этот класс.

Что касается того, почему он работал до этого, эта цитата из страницы TPC заставляет меня думать, что в EF изменились какие-то ручные XML-перезаписи.

Дизайнер модели данных сущности в VS2010 не поддерживает TPC (даже несмотря на то, что среда исполнения EF). Это в основном означает, что если вы следуете за подходами EF к базам данных или первым, а затем для настройки TPC требуется вручную записывать XML в файл EDMX, который не считается забавной практикой. Ну, не больше.

+0

Благодарим вас за разъяснение. Как было предложено в перекрестке MSDN, я удалил DbSet <> из моего DbContext, и теперь все работает. Мне бы хотелось увидеть поддержку OPENQUERY в EF. – fixitchris