是否可以修改Entity Framework 5中生成原始.edmx文件的方式

时间:2015-02-17 15:44:13

标签: asp.net-mvc oracle entity-framework entity-framework-5 odac

我在Asp.Net 5 MVC应用程序中使用Entity Framework 5.0 DB-First方法连接到oracle数据库。所有这些都适用于我为其生成EF数据模型的数据库,但我有3个不同(相同)的环境设置了_PROD,_UAT和_DEV。

我有配置转换设置指向我正在部署的适当环境。问题是,一旦我将连接字符串切换到另一个Schema(sql人员的“数据库”),它就会生成

ORA-00942: table or view does not exist

经过几个小时的探索,我发现了原因。查看原始.edmx代码文件后,我发现设计人员正在将Schema(sql folks的“数据库”)名称应用于Entity Container节点中的所有实体,请注意下面的REV_ALLOC_DEV。

<EntityContainer Name="ModelStoreContainer">
  <EntitySet Name="LOG_EVENTS" EntityType="Self.LOG_EVENTS" Schema="REV_ALLOC_DEV" store:Type="Tables" />
  <EntitySet Name="PAGE_LOCK" EntityType="Self.PAGE_LOCK" Schema="REV_ALLOC_DEV" store:Type="Tables" />
  <!-- Bunch more entities... --> 
</EntityContainer>

如果我进入并手动修改文件,要从实体容器中的所有实体中删除该模式名称“以及其他一些存在一些原始sql select语句的位置”,那么多个数据库之间的所有内容就像一个冠军。

所以我的问题是: 有没有办法修改设计器生成原始.edmx xml的方式,可能是通过.tt文件或类似的东西,所以我可以自动从附加中移除Schema(sql folks的“数据库”)名称。

另外作为一个注释,当在.edmx设计器的属性中时,我已经知道了Database Schema Name属性,当前设置为dbo,我看到它实际上只是删除了.edmx文件中的defaultdatabseschema属性。以下示例。也许有一种方法可以设置每个环境从我转换的配置中读取一个SchemaName值,但我想知道这个属性是否主要更适合于SQL模式,而不是oracle模式,所以我更倾向于尝试查找我对上述问题的回答。

<DesignerProperty Name="DefaultDatabaseSchema" Value="" />

另一个说明。 我看过很多引用:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
}

但我相信这只是代码优先的解决方案。

1 个答案:

答案 0 :(得分:0)

您是否设法修改了它?您是否考虑过创建不可知的连接,而不是尝试修改文件? 请看一下这个link from Sergey Barskiy

在Web配置文件中有3个引用:  csdl - 代表概念架构;  msl - 将.net查询转换为数据库命令; ssdl - 包含有关RDBM的信息

编译所有三个模式以生成模型的DLL。

作者创建了两个模型(一个用于Oracle,另一个用于SQL),然后动态地从一个模型切换到另一个模型。