У меня есть файл модели Entity Model (EDMX) и EF 4.3.1. Я пытаюсь внести изменения EDMX во время выполнения (измените значение store:Schema
таблиц/сущностей, используемых при генерации запроса). Я использую код на основе проекта EF Model Adapter Б. Хейнса.Модифицированная рабочая область объекта игнорируется при генерации SQL
Похоже, что я могу внести изменения в XML в порядке, используя адаптер модели схемы, и загрузить его в рабочую область метаданных, а затем передать его в соединение. Однако, когда запрос генерируется кодом рамки DbContext/EF, он использует старое значение для схемы.
- Создать новую MyEntities
- зарядите EDMX medata данные вручную
- Заменить «магазин: Схема» значение с новым желаемым значением
- Создать рабочую область метаданных из модифицированного XML
- Return новый EntityConnection с использованием этой измененной рабочей области
- Запрос данных (
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,