实体框架如何映射这种关系?

时间:2012-08-14 06:09:18

标签: asp.net asp.net-mvc entity-framework

我有

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条件...

2 个答案:

答案 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将自动过滤与用户相关的徽章。