我在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");
}
但我相信这只是代码优先的解决方案。
答案 0 :(得分:0)
您是否设法修改了它?您是否考虑过创建不可知的连接,而不是尝试修改文件? 请看一下这个link from Sergey Barskiy。
在Web配置文件中有3个引用: csdl - 代表概念架构; msl - 将.net查询转换为数据库命令; ssdl - 包含有关RDBM的信息
编译所有三个模式以生成模型的DLL。
作者创建了两个模型(一个用于Oracle,另一个用于SQL),然后动态地从一个模型切换到另一个模型。