生成SQL时,将忽略已修改的实体工作空间

时间:2013-03-09 08:54:44

标签: entity-framework entity-framework-4 dbcontext

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

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

  1. 创建新的MyEntities
  2. 手动加载EDMX medata数据
  3. 将“store:Schema”值替换为新的所需值
  4. 从修改后的XML
  5. 创建元数据工作区
  6. 使用修改后的工作区
  7. 返回新的EntityConnection
  8. 查询数据(from x in db.Table select x
  9. 这是正在发生的事情的基础。我们通过基于修改的工作空间和连接创建新的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,

1 个答案:

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