【问题标题】:Executing OPENQUERY Syntax with DbContext.Database.SqlQuery<T> in Entity Framework 6.0在 Entity Framework 6.0 中使用 DbContext.Database.SqlQuery<T> 执行 OPENQUERY 语法
【发布时间】:2013-11-13 16:57:56
【问题描述】:

我们计划从 EF4.2 升级到 6,但在 4.2 中工作的功能遇到问题。

SELECT emp_no_alpha as EmployeeNumber, code_user_1 as Code1, emp_name as EmployeeName FROM OPENQUERY(EMS02, 'select emp_no_alpha, code_user_1, emp_name from dce_mms where emp_no_alpha =''   100393'' ')

我们将上述语句与 dbContext.Database.SqlQuery($sql-stmt) 结合使用来检索实体。这适用于 4.2 中的此模型:

public abstract class Model_XX_EMS_DCEMMS
    {
        //LEN=9, RIGHT PAD
        [Column("EMP_NO_ALPHA", Order = 0), Key(), DatabaseGenerated(DatabaseGeneratedOption.None)]
        public string EmployeeNumber { get; set; }

        //LEN=5, RIGHT PAD
        [Column("CODE_USER_1")]
        public string Code1 { get; set; }

        [Column("EMP_NAME")]
        public string EmployeeName { get; set; }
    }

但是在 6.0 中,SQL 分析器尝试在默认目录中实际创建一个 Model_XX_EMS_DCEMMS 表,并且从不执​​行 select 语句,因此返回 null。

这就是 6.0 中发生的情况:

SELECT Count(*)
FROM INFORMATION_SCHEMA.TABLES AS t
WHERE t.TABLE_TYPE = 'BASE TABLE'
    AND (t.TABLE_SCHEMA + '.' + t.TABLE_NAME IN ('dbo.Model_XX_EMS_DCEMMS')
        OR t.TABLE_NAME = 'EdmMetadata')
CREATE TABLE [dbo].[Model_XX_EMS_DCEMMS] (
    [EMP_NO_ALPHA] [nvarchar](128) NOT NULL,
    [CODE_USER_1] [nvarchar](max),
    [EMP_NAME] [nvarchar](max),
    [Discriminator] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_dbo.Model_XX_EMS_DCEMMS] PRIMARY KEY ([EMP_NO_ALPHA])
)

是否有新的 DbContext 配置或我缺少的一些属性?

【问题讨论】:

    标签: entity-framework entity-framework-4 entity-framework-6


    【解决方案1】:

    Entity Framework 正在创建一个带有鉴别器列的表以支持Table Per Hierarchy inheritance

    但是对于 OPENQUERY,您不需要该表。要停止 EF 为抽象类创建类似的表,您需要 Table Per TypeTable Per Concrete Type

    我对 OPENQUERY 的了解很多。您能否创建一个视图,EF 可以使用它来支持 TPT 中的抽象类?然后给继承这个类的表添加表属性。

    至于它以前为什么有效,TPC 页面上的这句话让我觉得 EF 发生了变化,或者你丢失了一些手动 XML 重写。

    VS2010 中的实体数据模型设计器不支持 TPC(即使 EF 运行时支持)。这基本上意味着,如果您遵循 EF 的 Database-First 或 Model-First 方法,那么配置 TPC 需要在 EDMX 文件中手动编写 XML,这不被认为是一种有趣的做法。好吧,没有了。

    【讨论】:

    • 感谢您的解释。正如 MSDN 交叉帖子中所建议的那样,我已经从我的 DbContext 中删除了 DbSet,现在一切正常。我希望在 EF 中看到 OPENQUERY 支持。
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多