2012-08-14 79 views
0

實體框架如何映射這種關係?

User: 
-ID 
-Name 

Badge 
-ID 
-Name (E.G "User has made 100 posts", the same relationship as Stackoverflow) 

所以,我意識到我需要一個第三個表,(如徽章在DB藏漢所以我建立的定義:在我的User類

UserBadge 
-ID 
-User 
-Badge 

所以現在我已經

List<UserBadge> Badges; 

問題是,我要去

Users.Find(1).Badges.Where(x => x.User == user && x.Badge = badgeIWant) 
    .FirstOrDefault(); 

(或類似的東西)因爲...... EF沒有智能(我猜測)自動知道「徽章」應該只包括用戶匹配的地方。

我該怎麼做?想到我可以有一個自定義的徽章吸取器,有LINQ的條件...

+0

你甚至沒有嘗試? – Eranga 2012-08-14 06:25:13

回答

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創建了BadgeUsers表,其中BadgeID和UserID作爲外鍵。從那裏你可以查詢和EF知道你在談論哪些徽章。

+0

謝謝你的回覆它的奇妙,但很抱歉,爲什麼徽章中的用戶集合稱爲徽章?它應該被稱爲用戶嗎? – 2012-08-14 09:17:50

+0

@William:對,對不起:)。它應該被稱爲用戶。我剛剛從用戶模型複製粘貼,並忘記更改徽章。順便說一下,如果你勾選它作爲答案,一般的做法是也投票支持該答案(0以上的小頂部箭頭):) – TCM 2012-08-14 11:14:28

+1

它說我不能,需要15 reptuation :(大聲笑 – 2012-08-14 22:04:32

0

如果你想獲得用戶的所有徽章,然後只使用users.Find(1).Badges。 EF將自動過濾與用戶相關的徽章。

+0

你是傳奇THANKYOU:D – 2012-08-14 08:18:23