请选择 进入手机版 | 继续访问电脑版

Aic-tech BBS

 找回密码
 立即注册

扫一扫,访问微社区

搜索
查看: 990|回复: 0

EF框架下,VS从数据库更新数据模型导入视图失败……

[复制链接]

15

主题

25

帖子

431

积分

超级版主

Rank: 8Rank: 8

积分
431
发表于 2017-6-7 11:39:05 | 显示全部楼层 |阅读模式
本帖最后由 wangjie 于 2017-6-7 11:40 编辑

在EF框架下进行项目开发时,我们在VS中通过edmx文件构建实体数据模型。
今天在更新数据模型时发现一个异常问题,某新建的视图无法添加到数据模型中!!!

视图就是下面这个样子(暂且无关乎视图创建脚本,所以脚本内容就不贴了)


在vs的edmx文件里也是可以看到建好的视图的

然而奇怪的是,该视图确无法加入数据模型中……
Error: The table/view 'V_PP_YIELD' does not have a primary key defined and no valid primary key could be inferred. This table/view has been excluded. To use the entity, you will need to review your schema, add the correct keys, and uncomment it.



………………………………………………这里是分割线…………………………………………

经查得知,数据库视图一般是没有主键的,而EF在导入数据模型时会为视图构建虚拟的主键,而对于可作为虚拟主键的首要要求就是该字段非空~
而对于我们上面的视图而言,其各个字段都是可空的,自然也就无法导入到数据模型中

那么解决方案当然也就是需要使视图中包含非空字段
具体到不同的数据库,实际的解决方法也有所不同

》》》》SQL Server
SQL Server的处理比较简单,使用ISNULL就可以了,可以创建一个非空字段

》》》》Oracle
Oracle数据库很麻烦,暂时没有探求到普适的解决方案
目前已知的一种处理办法,调整视图构建方法,但与上面的SQL Server处理方法不同,这并不是普适的方案
在SQL Server中无论视图的构建需要如何,总可以通过ISNULL添加一个新非空字段,或修改已有字段为非空;但在Oracle中并无ISNULL方法可用,对于很多视图的构建需要而言,根本无法调整已有的构建语句以使字段为非空

在此需要强调的一点,所谓字段非空并非是指视图实际数据该字段值非空,而是指Oracle根据视图脚本解析出的视图结构该字段非空
对于很多情况明明数据一定非空,但仍有可能在视图中被识别为可空字段
即便使用类似NVL这些函数也是无用
笔者也试图通过用Rownum构建一个字段,但仍被识别为可空字段

附一个难于处理例子以便大家理解
  1. CREATE OR REPLACE FORCE VIEW MES.V_PP_YIELD
  2. (
  3.    ID,
  4.    MATDATI,
  5.    DATIQTY,
  6.    DATI,
  7.    DEFQTY
  8. )
  9. AS
  10.    SELECT ROWNUM AS ID,
  11.           lots.MatDati,
  12.           lots.DatiQty,
  13.           defs.Dati,
  14.           defs.DefQty
  15.      FROM    (  SELECT TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD') AS MatDati,
  16.                        SUM (lot.QTY) AS DatiQty
  17.                   FROM TABLE_LOT lot
  18.               GROUP BY TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD')) lots
  19.           JOIN
  20.              (  SELECT TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD') AS Dati,
  21.                        SUM (defe.DEF_QTY) AS DefQty
  22.                   FROM TABLE_LOT lot, TABLE_DEFECT defe
  23.                  WHERE lot.LOT_NO = defe.LOT_NO
  24.               GROUP BY TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD')) defs
  25.           ON lots.MatDati = defs.Dati;
复制代码
该问题的合理解决方案还在探索中……
目前感觉创建一个新非空字段更为可行,只是暂未想到合理的创建方式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
决策远比执行要难得多……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Beijing Advanced Information and Control Co. Ltd.

GMT+8, 2019-10-15 09:32 , Processed in 0.094463 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表