博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framwork one to one problem
阅读量:6859 次
发布时间:2019-06-26

本文共 2124 字,大约阅读时间需要 7 分钟。

问题:

 

//针对“一对一”关系的设置

modelBuilder.Entity<BlogSite>().HasRequired(b => b.BlogUser).
WithRequiredDependent().Map(conf => conf.MapKey("UserID"));

//出现如下恶心的脚本

SELECT 

[Extent1].[BlogID] AS [BlogID], 
[Extent1].[BlogApp] AS [BlogApp], 
[Extent1].[IsActive] AS [IsActive], 
[Join1].[UserID1] AS [UserID], 
[Join1].[Author] AS [Author], 
[Join3].[BlogID] AS [BlogID1]
FROM   [dbo].[BlogSite] AS [Extent1]
LEFT OUTER JOIN  (SELECT [Extent2].[UserID] AS [UserID1], [Extent2].[Author] AS [Author]
    FROM  [dbo].[BlogUser] AS [Extent2]
    LEFT OUTER JOIN [dbo].[BlogSite] AS [Extent3] ON [Extent2].[UserID] = [Extent3].[UserID] ) AS [Join1] 
    ON [Extent1].[UserID] = [Join1].[UserID1]
LEFT OUTER JOIN  (SELECT [Extent4].[UserID] AS [UserID2], [Extent5].[BlogID] AS [BlogID]
    FROM  [dbo].[BlogUser] AS [Extent4]
    LEFT OUTER JOIN [dbo].[BlogSite] AS [Extent5] 
    ON [Extent4].[UserID] = [Extent5].[UserID] ) AS [Join3] ON [Extent1].[UserID] = [Join3].[UserID2]
WHERE 1 = [Extent1].[IsActive]

 

dudu的解决办法:

WithMany()

dudu的解决方案无疑可以满足大家的需求,但是看着这个很难跟一对一联系起来,不过话说回来,在一对多中也是这个脚本。其实一对一本质是就是把概念上一张表在物理上分为两张表。

网上看了一句话:

For one-to-one relationships, EF expects that the tables are using the same primary key. And really, if it's a true one-to-one they probably should.

说的真好,但是实际上大家在设计库,不管什么原因总有跟设计原则相违背的地方,我们不可能重新设计表等恐怖的操作。在dudu的示例中BlogSite和BlogUser 共有字段UserId,那么咱就在Ef中指定如下

modelBuilder.Entity
().ToTable("BlogUser"); modelBuilder.Entity
().HasKey(u => u.UserID); modelBuilder.Entity
().ToTable("BlogSite"); modelBuilder.Entity
().HasKey(b => b.);
一对一:
modelBuilder.Entity
().HasRequired(b => b.BlogUser). WithRequiredDependent();
输出脚本:
 

SELECT

[Extent1].[BlogID] AS [BlogID],
[Extent1].[BlogApp] AS [BlogApp],
[Extent1].[IsActive] AS [IsActive],
[Extent1].[UserID] AS [UserID],
[Extent2].[UserID] AS [UserID1],
[Extent2].[Author] AS [Author]
FROM [dbo].[BlogSite] AS [Extent1]
INNER JOIN [dbo].[BlogUser] AS [Extent2] ON [Extent1].[UserID] = [Extent2].[UserID]
WHERE 1 = [Extent1].[IsActive]

 

本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2011/07/14/2106196.html,如需转载请自行联系原作者

你可能感兴趣的文章
java B2B2C springmvc mybatis仿淘宝电子商城系统-整合企业架构的技术点
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
centos批量修改文件名
查看>>
Struts 自己的总结报告
查看>>
急是没有用的
查看>>
AT&T汇编学习笔记(一)
查看>>
IBM专家集成系统讲究预置能力 打造开放的云
查看>>
开源日志系统比较
查看>>
Red hat linux 安装
查看>>
ubuntu samba服务器
查看>>
利用脚本在Virtualbox中部署fuel Openstack
查看>>
Jetty - 嵌入式运行Servlet
查看>>
同一个服务器安装两个tomcat
查看>>
链表的插入排序 Insertion Sort List
查看>>
我的友情链接
查看>>
曹丽丽:与百度互动必听--百度站长平台新动向
查看>>
BUG:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值...
查看>>
fastDFS安装和使用
查看>>
Linux增加硬盘并挂载到VLM逻辑卷
查看>>