首先使用 Entity Framework 6 代码访问 Oracle Synonyms

Posted

技术标签:

【中文标题】首先使用 Entity Framework 6 代码访问 Oracle Synonyms【英文标题】:Accessing Oracle Synonyms using Entity Framework 6 code first 【发布时间】:2015-02-17 15:35:34 【问题描述】:

我目前正在开发一个将使用 Entity Framework 6.1.1 和 Oracle 11g 数据库后端的项目。我将跨多个模式访问表,其中一些模式还具有跨模式的外键关系(查找表、企业数据等)。

传统上,我们使用同义词作为将这些跨模式表暴露给特定登录的一种方式。我的问题是......如何使用代码优先映射在 EF6 中映射这些同义词?我直接在单个模式中映射到表没有问题,但这当然还不够,因为我的表跨越了多个模式。到目前为止,我的代码优先映射无法识别同义词。

是否有人能够对 Oracle 同义词进行代码优先映射?

【问题讨论】:

你能先使用 EF 代码和同义词吗?我目前遇到了同样的问题。 【参考方案1】:

您可以尝试为特定实体设置架构:

modelBuilder.Entity<DATA>().ToTable("DATA", "schema");

或者装饰类:

[Table("DATA", Schema="SCHEMA"] public class DATA..

【讨论】:

【参考方案2】:

您可以使用 EF Fluent API 来定义架构:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.HasDefaultSchema("MY_SCHEMA_NAME");

如果您想使用 Oracle 同义词,可以删除架构:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.HasDefaultSchema(string.Empty);

这将生成包含FROM "MY_TABLE" 而不是FROM "dbo"."MY_TABLE"FROM "MY_SCHEMA_NAME"."MY_TABLE" 的SQL

我正在使用:

EntityFramework 6.1.3 Oracle.ManagedDataAccess 12.1.2400 Oracle.ManagedDataAccess.EntityFramework 12.1.2400

【讨论】:

以上是关于首先使用 Entity Framework 6 代码访问 Oracle Synonyms的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6.0 - 删除时的奇怪行为

Entity Framework 6 查询时上下文重复

Entity Framework linq 中的动态表名

如何用Entity Framework 6 连接Sqlite数据库

在Oracle中使用Entity Framework 6 CodeFirst

Entity Framework 6 暂时禁用拦截