ADO.NET实体数据模型多表连接查询中的实体键问题

  ADO.NET是.NET与数据库互操作的核心,而ADO.NET实体数据库则增强了.NET应用程序与数据库的互联能力,通过ADO.NET实体数据模型我们可以很方便的与底层数据库进行强类型的数据互操作。大大的方便了设计人员,从而也提高了数据库操作的安全性。最近在使用到Siverlight的领域数据服务时遇到一个很特别的问题[在应用程序中的结果和数据库的结果不一样],经过反复的试验,终于找到了问题的根源,那就是ADO.NET实体数据模型依赖于实体键,它的查询会生成实体键的唯一结果集。

  现在来看看具体的操作过程和处理方式:

  为了对数据库的表进行操作,在数据库的视图中建立了一个连接两个原子表的 vw_DesksAndUsers 的视图,这个视图旨在为了连接已存在的User表和Desk的数据,于是我做了如下的T-SQL的视图,如下所示:

  在SQL Server 2008中得到的查询结果如下:

  也就是说得到了预期的结果,[这一步很成功]。接下来进行第二步。

  第二步:新建一个Siverlight商业应用程序SiverlightDomainDb,在生成的项目中会支持WCFRIA服务。这是对Siverlight领域服务的支持所必须的。

  第三步:在Web项目中添加一个ADO.NET实体数据模型的新项,在向导中选择相应的数据库连接和数据表、视图及存储过程等,完成以后会生成相应的实体数据类型和上下文,并得到.edmx的模型图。如下所示:

  根据VS2010的提示,它为我们生成了两个实体键:DeskId,IsPlaying(这是Desk表中的两个字段);现在重新生成项目。

  第四步:根据实体模型添加Web领域服务项。(在这一步需要添加相应的表和元数据信息)

  第五步:Siverlight项目中将数据源所在vw_DesksAndUsers 的DataGrid拖到Home.xaml中,完成、调试。并没有得到上面的结果,而是生成了如下的DataGrid:

  经过仔细的观察,才发现原来是ADO.NET实体数据模型中的结果集依赖于实体键,也就是说Siverlight领域服务会根据实体键的唯一生成查询的结果集,于是就产生了上面的以DeskId为唯一键的数据。

  处理:

  根据以上的分析,要得到预期的结果,必须设置合适的实体键,为了不至于影响到底层的SQL数据库,我们只需要修改.edmx模型图中的的实体键即可(点击右键选中或不选中“实体键”):

  现在重新生成项目并运行程序,程序得到了预期的结果。

  Siverlight商业应用程序作为一个专为数据显示而生的模板,为数据库的呈现提供了友好的界面,由于其优化的数据库的处理方式使得我们在使用时不得不考虑一些它们之间的细微差别[由于在VS中没能看到有LINQ生成的T—SQL查询语句,所以我也只是提供了一个简单的解决方案而已,我想其深层的原因在于LINQ查询中生成的T-SQL语句与数据库中的T-SQL语句不同而产生。

时间: 2024-10-04 17:45:07

ADO.NET实体数据模型多表连接查询中的实体键问题的相关文章

关联数据表查询,不用表连接,不建立外键,如何查询出来

问题描述 关联数据表查询,不用表连接,不建立外键,如何查询出来 查询两个有关联的数据表,一个表是cate分类表,另一个是game游戏表,分类表的id=game表的cate_id 不用表连接,不建立外键,怎么将game表的数据和cate表的数据一一对应查出来.求答 解决方案 select game.*(select cate_name from cate where 分类表的id=game.cate_id) as 分类名 from game

android使用ormLite,多表连接查询

问题描述 android使用ormLite,多表连接查询 解决方案

javaee-java菜鸟请问下,两个数据表连接查询问题

问题描述 java菜鸟请问下,两个数据表连接查询问题 hql="select t.id,t.name,p.lname,t.beizhu,t.human,t.city,t.lrr,t.lrtime,t.modtime,t.address from CrmCustomer t, CrmCustomerLxr p where t.tend='已成单' and p.lname like '%" + lname + "%' and t.id=p.customerid "; S

代码-linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下

问题描述 linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下 with temp as ( select (case when SHIFTSCHEDULEID is null then (case when TICKET_SELL_TYPE=2 then (select COMPANY_ID from TBL_YD_SHIFT where SHIFTNUMBER= (select SHIFTNUMBER from TBL_SP_TICKET where tick

9. 多表连接查询

        多表查询可理解为一个嵌套循环遍历. 多表连接查询有两种规范,较早的SQL92规范支持: 等值连接:连接条件要求两列值相等 非等值连接 广义笛卡尔积:没有任何连接条件(n*m条记录) 外连接 [MySQL 不支持 92规范的外连接]         外连接就是在外连接符所在的表中增加一个"万能行",这行记录的所有数据都是null,而且该行可以与另一个表中所有不满足条件的记录匹配.即可以把另一表中的所有记录选出来,不管是否满足条件. SQL99规范:提供可读性更好的多表连接

oracle两表连接查询问题

问题描述 oracle两表连接查询问题 有两张表,一张是个人信息表包括考生姓名,年龄,性别等一系列个人信息和一些其他信息: 第二张表是成绩表,其中也包括部分考生信息和分数: 现在想要在打开成绩表的时候,个人信息字段就已经对应上第一张表了,不需要自己填写, 这个应该怎么实现,代码应该怎么写? 解决方案 http://zhidao.baidu.com/link?url=Rb77btoUtGFpnDID8qotZfN3TTQcPVhzseA4ecOHNZLznZB3bx89MUzJSOR29sNpFM

MySQL中基本的多表连接查询教程_Mysql

一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如:         由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN  2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS J

多对多关系多表连接查询,同一个字段同时满足多个条件

问题描述 分类表t_keytype商品表t_product分类商品关联表t_typeproducttid(分类ID)name(分类名称)pid(商品ID)name(商品名称)idpid(商品ID)tid(分类ID)1分类11商品11112分类22商品2212321422现在要表连接查询,根据分类ID字段同时满足多个条件的商品"(分类id=1and分类id=2)"查询是同一个字段多个and,请问改怎么写,尽量不要子查询因为数据量比较大,在此谢谢各位啦! 解决方案 解决方案二:网了发图,如

Access数据库多表连接查询

第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * from A inner join B on A.ID=B.ID inner join C on B.ID=C.ID 此写法在Access中报错,Access对SQL语法理解方式不一样,它将两表连接后当作一个表然后再与第三个表连接,因此要改成 select * from (A inner join B o