在Entity Framework 6.0中使用DbContext.Database.SqlQuery <t>执行OPENQUERY语法</t>

时间:2013-11-12 20:51:35

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

我们计划从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配置或我缺少的某些属性?

1 个答案:

答案 0 :(得分:1)

实体框架正在创建一个带有鉴别器列的表,以支持Table Per Hierarchy inheritance

但是使用OPENQUERY你不需要那张桌子。要停止EF为抽象类创建类似的表,您需要Table Per TypeTable Per Concrete Type

我不知道很多关于OPENQUERY的任何事情。你能创建一个EF可以用来支持TPT抽象类的View吗?然后将表属性添加到继承此类的表中。

至于之前的工作原理,来自TPC页面的引用让我觉得EF中的内容发生了变化,或者你丢失了一些手工XML重写。

  

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