泄漏实体框架的抽象 - 只是一点点

bis*_*314 8 c# linq entity-framework-6 oracle12c

如果我想访问RDBMS特有的功能怎么办?有没有办法将数据库特定的SQL注入到EF生成的SQL中?

例如,在Oracle 12c中,您可以为DDL和DML添加时间有效性(有很多种类;我将仅使用这里的简单示例):

这可以在C#中很好地建模:

[TemporalAxis("valid_time")]
public class SomeEntity
{
  public string SomeField { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后与LINQ一起使用

var results = context.SomeEntities
                .Where(i => i.SomeField = "some_value")
                .AsOfPeriodFor("valid_time", dateVariable);
Run Code Online (Sandbox Code Playgroud)

.AsOfPeriodFor扩展可以是这样的:

public static class TemporalExtensions
{
    public static IEnumerable<TSource> AsOfPeriodFor<TSource>(this IEnumerable<TSource> source, 
        string temporalAxis, DateTime asOfDate)
    {
        // reflect on TSource to ensure it has the correct attribute/value (else degrade/throw)
        // do something to source that sets up EF to add the extra clause in the DML

        return source;
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜DbContext可以反映它的实体在初始化时驱动DDL(我将不得不详细了解这一点).

以上结果是EF将发出以下SQL

DDL(初始化时):

create table some_table
  some_field varchar2(30)

  period for valid_time -- Need to inject this at DB Initialize time
);
Run Code Online (Sandbox Code Playgroud)

DML(在查询时):

select
  some_field
from 
  some_table
  as of period for valid_time to_timestamp('27-Oct-14') -- and this at query time
where
  some_field = 'some_value';
Run Code Online (Sandbox Code Playgroud)

我的问题:是否有可用于将这些RDBMS专业短语注入EF生成的SQL的钩子或IInterfaces?或者必须将上述内容与自定义Oracle数据库提供程序结合使用?这种类型的东西是否可行,你能指点我的博客/书籍/视频/大师可以提供指导吗?

Jas*_*ard 1

据我所知,无法修改 EF 提供程序生成的 SQL。

但是,对于那些特殊情况,您可以直接运行 SQL。

context.Database.SqlQuery<SomeEntity>("select * from SomeEntity " +
"some more custom sql here " +
"where somecomlumn = @p1", parameter1);
Run Code Online (Sandbox Code Playgroud)

您只需确保返回的任何内容都与 SomeEntity 的形状匹配。