2013-03-09 2 views
0

У меня есть файл модели Entity Model (EDMX) и EF 4.3.1. Я пытаюсь внести изменения EDMX во время выполнения (измените значение store:Schema таблиц/сущностей, используемых при генерации запроса). Я использую код на основе проекта EF Model Adapter Б. Хейнса.Модифицированная рабочая область объекта игнорируется при генерации SQL

Похоже, что я могу внести изменения в XML в порядке, используя адаптер модели схемы, и загрузить его в рабочую область метаданных, а затем передать его в соединение. Однако, когда запрос генерируется кодом рамки DbContext/EF, он использует старое значение для схемы.

  1. Создать новую MyEntities
  2. зарядите EDMX medata данные вручную
  3. Заменить «магазин: Схема» значение с новым желаемым значением
  4. Создать рабочую область метаданных из модифицированного XML
  5. Return новый EntityConnection с использованием этой измененной рабочей области
  6. Запрос данных (from x in db.Table select x)

Это основа того, что происходит. Мы создаем наш dbContext, создавая новый EntityConnection, основанный на модифицированной рабочей области и соединении. Существует также некоторая упаковка поставщика и такая работа, для ведения журнала и т. Д. Извините, если это сбивает с толку.

public MyEntities(): base(this.Create("name=MyEntitiesConnStr"), true) 
{ 
} 

public static DbConnection Create(string connectionString) 
{ 
    var ecsb = ConnectionHelper.ResolveConnectionStringDetails(connectionString); 
    var workspace = GetModifiedEntityWorkspace(ecsb); 
    var storeConnection = DbProviderFactories.GetFactory(ecsb.Provider).CreateConnection(); 
    Debug.Assert(storeConnection != null, "storeConnection != null"); 
    storeConnection.ConnectionString = ecsb.ProviderConnectionString; 
    var wrappedConnection = MyWrappedConnetion.WrapConnection(storeConnection); 
    _log.Debug("Creating new entity connection"); 
    var newEntityConnection = new EntityConnection(workspace, wrappedConnection); 
    WireEvents(wrappedConnection); 
    return newEntityConnection; 
} 

private static MetadataWorkspace GetModifiedEntityWorkspace(EntityConnectionStringBuilder ecsb) 
{ 
    // instantiate manager class 
    // read all XML items from the embedded resources 
    // change the store:schema to the real one for this environment 
    // <EntitySet Name="..." store:Type="Tables" store:Schema="SCM" store:Name="TBLX"> 
    // create new MetadataWorksspace(ssdl,cdl,...) 
} 

Любая идея, где/почему она до сих пор получает старый Schema значение для запроса? Я думаю, что это правильно работает с EF 4.0,

ответ

0

Оказывается, проблема была связана с элементом <DefiningQuery> под набором объектов.

Этот элемент содержит определение базового запроса, используемого для определения объекта. Возможно, что-то изменилось, и теперь они ссылаются на это по соображениям скорости. Необходимо также изменить этот запрос, а затем изменение схемы вступит в силу.

<EntitySet Name="MYTABLE" store:Type="Tables" store:Schema="MYSCHEMA" ...> 
<DefiningQuery> 
    SELECT MYTABLE.COLUMN [...REPEAT..] 
    FROM MYSCHEMA.MYTABLE AS MYTABLE 
</definingQuery> 

Таким образом, изменение "MYSCHEMA" в обоих этих местах фиксирует его. Просто элемента store:Schema недостаточно.

Смежные вопросы