用户表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]
这里就报错:
确实没有这个字段,EF生成SQL时怎么就自动给UserID前面加个表名呢?请问是哪里出了问题?
首先: 定义有问题吧 ,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
学到的,你可以看看
不是简单的一对多,好友关系表的主键是两个用户ID做为联合主键,现在的问题就是生成的SQL给User表的UserID字段加上了表名,导致该字段不存在,我已经把SQL贴在上面了。
实体定义的有问题,用户实体按楼上的,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; }
}
刚才确实忽略了复合主键的问题,,学到了,但是强烈建议不要用复合主键。。。。
[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字段,哪里还有问题?
var list = dbset.Include(f => f.Friends ).Where(u=>u.UserID='123').ToList();
用这个试试 呢
或者
varlist = dbset.Include(f => f.MyUser).Where(f => f.
MyUser.UserID
== "1000058418").ToList();
public virtual User User { get; set; }这个地方可能有问题。
User类没问题,User类跟其他类一对多的关系都没问题,其他类里有UserID字段,主要是Friend表的键是复合主键而且都是引用的User表的UserID
- - 是不是结果里有两个UserID阿.. 建议重命名一下 .
[Extent2].[UserID] as table1userid
楼主有没有解决啊。我也碰到这个问题。。
走过,路过,看过,还是没哟明白怎么破