避免使用实体框架使用 Oracle 模式名称

Posted

技术标签:

【中文标题】避免使用实体框架使用 Oracle 模式名称【英文标题】:Avoid Oracle schema name with Entity Framework 【发布时间】:2018-02-14 13:44:19 【问题描述】:

我正在使用Official Oracle SQL 和Entity Framework 驱动程序来读取数据库。但是在读取数据库时,它会在表名前加上“dbo”。:

SELECT
*
FROM "dbo"."Woningen"

没有“dbo”。前缀代码工作正常,它会导致错误“表或视图不存在”。这可能是因为用户不是“dbo”,因此它无权访问该模式。这是我正在使用的实体框架代码:

[Table("Woningen")]
public class Woningen

我已尝试更新 Oracle nuget 包,但随后出现错误“连接字符串格式不正确”。所以它可能和以前有同样的错误,只是失败得更快。这是我使用的connectionString格式:

<add name="DefaultConnection"
  providerName="Oracle.ManagedDataAccess.Client" 
  connectionString="USER ID=testUser;PASSWORD=password;  
  Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=serverUrl)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=Database)));"/>

我可以看到这个问题的三种可能的解决方案,但不知道如何实现它们:

    操纵实体框架以从查询中排除架构名称 授予我的用户访问架构的权限 如果有人知道格式是如何变化的,请更新驱动程序并修复连接字符串格式..

请注意,当前代码已经在生产环境中运行,因此当前版本应该没问题。数据库和它的用户是新的,所以问题可能在于它们是如何创建的。

【问题讨论】:

您可以指定要在 EF 中使用的适当架构,如果有帮助? EF6+modelBuilder.HasDefaultSchema(“your schema name”); @DanielShillcock 谢谢,这就是解决方案,使用用户名作为架构名称。如果你把它变成一个答案,我会接受它。 【参考方案1】:

您可以指定实体框架使用的架构。见下文

如果您使用的是 Entity Framework 6+,您可以使用以下内容

public class Context : DbContext
  
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        //Set a default schema for ALL tables
        modelBuilder.HasDefaultSchema("YourSchemaName");
    

如果您希望在特定表上设置架构...

[Table("Woningen"), Schema = "YourSchemaName")]
public class Woningen  

如果您使用的是 EF5

public class Context : DbContext
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
     
         // Unfortunately you have to specify each table you want to set a schema for...
         modelBuilder.Entity<Woningen>().ToTable("Woningen", "YourSchemaName");
     

【讨论】:

对数据库优先方法有什么建议吗?因为,几乎在所有情况下,dev env 的架构都与 prod env 不同。 @SyedAliTaqi 也许将架构名称存储在 webconfig/应用程序设置中? 感谢您的快速回复!我试过了,但无法很好地连接所有部分。如果您可以共享博客或带有代码的链接作为指南,那会很有帮助吗? @SyedAliTaqi 检查this 回答。它告诉您如何访问 web.config 中的应用程序设置。 问题是,据我研究,在实体框架中没有选项可以在运行时为 DB 优先方法传递模式。不过感谢您的帮助,非常感谢。

以上是关于避免使用实体框架使用 Oracle 模式名称的主要内容,如果未能解决你的问题,请参考以下文章

具有实体框架 4.1 和父/子关系的存储库模式

如何使用 Oracle 的实体框架支持强制帕斯卡案例?

实体框架数据库首先是多个模式重复的表名

使用实体框架 4 和存储库模式的多层架构

实体框架5与Oracle表/视图不存在不一致?

实体框架和多个模式