我们计划从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配置或我缺少的某些属性?
答案 0 :(得分:1)
实体框架正在创建一个带有鉴别器列的表,以支持Table Per Hierarchy inheritance
但是使用OPENQUERY你不需要那张桌子。要停止EF为抽象类创建类似的表,您需要Table Per Type或Table Per Concrete Type
我不知道很多关于OPENQUERY的任何事情。你能创建一个EF可以用来支持TPT抽象类的View吗?然后将表属性添加到继承此类的表中。
至于之前的工作原理,来自TPC页面的引用让我觉得EF中的内容发生了变化,或者你丢失了一些手工XML重写。
VS2010中的实体数据模型设计器不支持TPC(即使EF运行时也支持)。这基本上意味着如果您遵循EF的Database-First或Model-First方法,那么配置TPC需要在EDMX文件中手动编写XML,这不被认为是一种有趣的做法。好吧,没有了。