0

我有一个实体模型 (EDMX) 文件和 EF 4.3.1。我正在尝试对 EDMX 进行运行时修改(更改store:Schema用于生成查询的表/实体集)。我正在使用基于B. Haynes 的EF 模型适配器项目的代码。

看来我可以使用模式模型适配器对 XML 进行很好的更改,并将其加载到元数据工作区,然后将其传递给连接。但是,当 DbContext/EF 框架代码生成查询时,它使用架构的旧值。

  1. 创建一个新的 MyEntities
  2. 手动加载 EDMX 元数据
  3. 将“store:Schema”值替换为新的所需值
  4. 从修改后的 XML 创建元数据工作区
  5. 使用修改后的工作区返回一个新的 EntityConnection
  6. 查询数据 ( from x in db.Table select x)

这是正在发生的事情的基础。我们通过基于修改后的工作空间和连接创建一个新的 EntityConnection 来创建我们的 dbContext。还有一些提供者包装等等,用于日志记录等。抱歉,如果这令人困惑。

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,

4

1 回答 1

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元素是不够的。

于 2013-03-12T09:56:02.360 回答