2012-07-27 32 views
1

模型類:MVC 3實體框架簡單的映射

public class User { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "User Name")] 
    public string UserName { get; set; } 

    public virtual ICollection<Asp_Membership> CreateDates { get; set; } 
} 

public class Asp_Membership { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "Date Created")] 
    public DateTime CreateDate { get; set; } 
} 

的DbContext

public class UsersContext : DbContext { 
     public UsersContext() : base("ApplicationServices") { } 
     public DbSet<User> Users { get; set; } 
     public DbSet<Asp_Membership> Asp_Memberships { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
      //mapping of Users and Membership 
      //what exactly do i put here to join the two tables by UserId 
     } 

我的問題很簡單,正如你可能會說,這是我第一次嘗試到嘗試瞭解EF實際如何工作。我想要做的是加入基於UserId的aspnet_Users表和aspnet_Membership表。我到底該怎麼做?

但更重要的是,我真的一直無法找到一個好的實體框架教程,任何建議?

--UPDATE--

的DbContext(同上)

模型類:

public class User { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "User Name")] 
    public string UserName { get; set; } 

    public virtual Asp_Membership asp_Membership { get; set; } 
} 

public class Asp_Membership { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "Date Created")] 
    public DateTime CreateDate { get; set; } 
} 

控制器:

private UsersContext db = new UsersContext(); 

// GET: /Users/Index 
public ActionResult Index() { 
    return View(db.Users.ToList()); 
} 

索引頁:(不必要的元素去掉...)

@model IEnumerable<ReservationPro.Models.User> 
... 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.UserName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.asp_Membership.CreateDate) 
     </td> 
    </tr> 
} 

所有我試圖做的是弄清楚如何從默認ASPNETDB加入兩個獨立的表「aspnet_Users」和「aspnet_Membership」 。正如模型類中所述,它們都有'UserId'列。我知道這是一個簡單的問題,我很抱歉讓我感到困惑。正如你可能知道的那樣,我剛剛開始使用EF,並且試圖用一些簡單的代碼來讓我的手「變髒」。

+1

爲什麼用戶擁有會員資格的*集合*,爲什麼他們被稱爲* CreateDates *? – Slauma 2012-07-27 17:58:37

+0

這是一個非常好的問題,請檢查更新的代碼 – theStig 2012-07-27 20:20:31

回答

1

隨着模型類在您的更新,你可以試試這個映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(u => u.asp_membership) 
     .WithRequired(); 
} 

映射意味着用戶可以有會員(不超過一個),但它不是必需的(HasOptional/0..1)。另一方面會員總是必須只有一個相關用戶(WithRequired/1)。

在ASP.NET成員資格表中,User表使用關係的主鍵表示主體,Membership表是與外鍵相關的表。但外鍵同時是Membership表的主鍵(UserId)。所以,這種關係是一種共享的主鍵一對一關係。您必須使用上面的映射來明確地定義它,否則默認情況下EF會從您的模型中推斷出一對多的關係。

+0

哇,就是這樣。謝謝Slauma的迴應。順便說一句,你有什麼建議一些教程來看看流利的API? – theStig 2012-07-28 17:42:46

+0

另外,@Slauma,你怎麼知道Membership表是與外鍵相關的? – theStig 2012-07-28 17:44:32

+0

@theStig:關於'DbContext'的12部分教程:http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part- 1-introduction-and-model.aspx Then Julie Lerman的兩本書(我沒有讀過它們,但每個人都推薦過這本書):http://www.amazon.com/Programming-Entity-Framework-Code-First/ dp/1449312942和http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969我通過使用ASP.NET會員表查找數據庫找到了依賴關係 - >在用戶和成員之間打開關係表 - > FK在Membership表中,PK在User表中。 – Slauma 2012-07-28 20:11:27

1

你快到了。試試這個:

public class User { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "User Name")] 
    public string UserName { get; set; } 

    public virtual Asp_Membership asp_membership { get; set;} 
} 

public class Asp_Membership { 
    [Key] 
    public Guid UserId { get; set; } 

    [Display(Name = "Date Created")] 
    public DateTime CreateDate { get; set; } 

    public virtual User user { get; set;} 
} 

這樣,你就可以從一個方向訪問另一個方向。如果你只想要在一個方向上,只要把它放在想要訪問另一個方向的課程中。此外,假定關係是1比1.從你的問題中很難分辨出來。

+0

我現在收到一個錯誤:「無效的列名稱asp_membership_UserId'。」 – theStig 2012-07-27 17:51:15

+0

對不起,什麼? – 2012-07-27 17:52:31

+0

基本上我想要做的是查看與列「用戶名」和「CreateDate」的表,所以當我通過Users.ToList()到視圖,我得到該錯誤 – theStig 2012-07-27 17:57:54