首页 新闻 搜索 专区 学院

entity framework 联合主键查询

0
悬赏园豆:80 [已关闭问题] 关闭于 2011-12-30 19:35

用户表User,主键UserID

好友关系表Friends,联合主键MyUid,FriendUid都是对应User表的UserID

 ///<summary>
/// 好友关系表
///</summary>
public class Friend
{
///<summary>
/// 添加好友时间
///</summary>
public DateTime AddTime
{
get;
set;
}

///<summary>
/// 好友ID
///</summary>
public string FriendUid
{
get;
set;
}

///<summary>
/// 主人ID
///</summary>
public string MyUid
{
get;
set;
}

public virtual User User { get; set; }
}

查询某个用户的好友

//查询UserID为123的好友
var list = dbset.Include(f => f.User).Where(f=>f.MyUid='123').ToList();

生成的SQL:

SELECT 
1 AS [C1],
[Extent1].[MyUid] AS [MyUid],
[Extent1].[FriendUid] AS [FriendUid],
[Extent1].[AddTime] AS [AddTime],
[Extent2].[UserID] AS [UserID],
[Extent2].[UserName] AS [UserName]
FROM [dbo].[Friend] AS [Extent1]
LEFT OUTER JOIN [dbo].[User] AS [Extent2] ON [Extent1].[User_UserID] = [Extent2].[UserID]
WHERE N'1000058418' = [Extent1].[MyUid]

这里就报错:

列名 'User_UserID' 无效

确实没有这个字段,EF生成SQL时怎么就自动给UserID前面加个表名呢?请问是哪里出了问题?

lzxy的主页 lzxy | 初学一级 | 园豆:27
提问于:2011-12-08 13:06
< >
分享
所有回答(6)
1

首先: 定义有问题吧 ,User 和 Friends 是一对多的关系 ,感觉应该这样定义

 

///<summary>
/// 用户表
///</summary>
public class User
{
///<summary>
/// 用户名
///</summary>
public string UserName
{
get;
set;
}

///<summary>
/// 用户ID
///</summary>
public string UserID
{
get;
set;
}
public virtual ICollection<Friend> Friends { get; set; }
}
///<summary>
/// 好友关系表
///</summary>
public class Friend
{
///<summary>
/// 添加好友时间
///</summary>
public DateTime AddTime
{
get;
set;
}

///<summary>
/// 好友ID
///</summary>
public virtual User friend { get; set; }

///<summary>
/// 主人
///</summary>

public virtual User Owner { get; set; }
}

 

调用这样:

//查询UserID为123的好友
var list = dbset.Include(f => f.Friends ).Where(u=>u.UserID='123').ToList();

 

我没有仔细研究过EF  ,上面的东西 是看 

http://www.cnblogs.com/dudu/archive/2011/07/09/entity_framework_one_to_many.html

学到的,你可以看看 

 
魏生斌 | 园豆:236 (菜鸟二级) | 2011-12-08 13:37

不是简单的一对多,好友关系表的主键是两个用户ID做为联合主键,现在的问题就是生成的SQL给User表的UserID字段加上了表名,导致该字段不存在,我已经把SQL贴在上面了。

支持(0) 反对(0) lzxy | 园豆:27 (初学一级) | 2011-12-08 13:50
0

实体定义的有问题,用户实体按楼上的,Fridens实体改为:

    ///<summary>
/// 好友关系表
///</summary>
public class Friend
{
///<summary>
/// 添加好友时间
///</summary>
public DateTime AddTime
{
get;
set;
}

[Key]
[Column(Order=0)]
[ForeignKey("FriendUser")]
public string FriendUid
{
get;
set;
}

[Key]
[Column(Order=1)]
[ForeignKey("MyUser")]
public string MyUid
{
get;
set;
}

public virtual User FriendUser{ get; set; }
public virtual User MyUser{ get; set; }
}
artwl | 园豆:16526 (专家六级) | 2011-12-08 14:09

刚才确实忽略了复合主键的问题,,学到了,但是强烈建议不要用复合主键。。。。

支持(0) 反对(0) 魏生斌 | 园豆:236 (菜鸟二级) | 2011-12-08 14:12
 
[Extent1].[MyUid] AS [MyUid],
[Extent1].[FriendUid] AS [FriendUid],
[Extent1].[AddTime] AS [AddTime],
[Extent2].[UserID] AS [UserID],
[Extent2].[UserName] AS [UserName],
[Extent1].[User_UserID] AS [User_UserID]--这里怎么又多出个User_UserID
FROM [dbo].[Friend] AS [Extent1]
INNER JOIN [dbo].[User] AS [Extent2] ON [Extent1].[MyUid] = [Extent2].[UserID]
WHERE N'1000058418' = [Extent1].[MyUid]

我按你上面的实体修改后生成如上的SQL

//dbset是DbSet<Friend>
var list = dbset.Include(f => f.MyUser).Where(f => f.MyUid == "1000058418").ToList();

始终都加个User_UserID字段,哪里还有问题?

支持(0) 反对(0) lzxy | 园豆:27 (初学一级) | 2011-12-08 15:24
   var list = dbset.Include(f => f.Friends ).Where(u=>u.UserID='123').ToList();
用这个试试 呢
支持(0) 反对(0) 魏生斌 | 园豆:236 (菜鸟二级) | 2011-12-08 22:03
或者 
varlist = dbset.Include(f => f.MyUser).Where(f => f.
MyUser.UserID
== "1000058418").ToList();
 
支持(0) 反对(0) 魏生斌 | 园豆:236 (菜鸟二级) | 2011-12-08 22:06
0

public virtual User User { get; set; }这个地方可能有问题。

悟行 | 园豆:12240 (专家六级) | 2011-12-08 15:11

User类没问题,User类跟其他类一对多的关系都没问题,其他类里有UserID字段,主要是Friend表的键是复合主键而且都是引用的User表的UserID

支持(0) 反对(0) lzxy | 园豆:27 (初学一级) | 2011-12-08 15:46
0

- - 是不是结果里有两个UserID阿.. 建议重命名一下 .

 [Extent2].[UserID] as table1userid
、怕瓦落地 | 园豆:206 (菜鸟二级) | 2011-12-11 18:14
0

楼主有没有解决啊。我也碰到这个问题。。

IT_shandian | 园豆:204 (菜鸟二级) | 2012-09-20 15:01
0

走过,路过,看过,还是没哟明白怎么破

澄虚元 | 园豆:204 (菜鸟二级) | 2014-01-06 20:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册