我有
User:
-ID
-Name
Badge
-ID
-Name (E.G "User has made 100 posts", the same relationship as Stackoverflow)
所以我意识到我需要一个第三个表,(因为在DB中定义了徽章所以我创建了:
UserBadge
-ID
-User
-Badge
所以现在在我的User类中我有
List<UserBadge> Badges;
问题是,我要去
Users.Find(1).Badges.Where(x => x.User == user && x.Badge = badgeIWant)
.FirstOrDefault();
(或类似的东西)因为... EF没有智能(我猜)自动知道“徽章”应该只包括用户匹配的那些。
我该怎么做?我以为我可以为徽章设置一个自定义的getter,它有LINQ条件...
答案 0 :(得分:2)
首先是EF 4.3代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
namespace ConsoleApp
{
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Badge> Badges { get; set; }
}
public class Badge
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}
public class Context : DbContext
{
public Context()
: base("Votes")
{
}
public DbSet<User> Users { get; set; }
public DbSet<Badge> Badge { get; set; }
}
class Program
{
static void Main(string[] args)
{
Context context = new Context();
User user = context.Users.Include("Badges").Where(u => u.ID == 1).SingleOrDefault();
if(user != null)
{
//write your code.
}
Console.ReadKey();
}
}
}
我测试了它,这应该有用。这通常是多对多关系,因为用户可以拥有许多徽章,并且1个徽章可以属于许多用户。如果您运行此代码,您将发现EF创建带有BadgeID和UserID作为外键的BadgeUsers
表。从那里你可以查询,EF知道你在说什么徽章。
答案 1 :(得分:0)
如果您想获得用户的所有徽章,请使用users.Find(1).Badges
。 EF将自动过滤与用户相关的徽章。