MVC 3 Entity Framework简单映射键

时间:2012-07-27 17:37:24

标签: asp.net-mvc entity-framework

模型类:

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,并且只是想用一些简单的代码来弄脏手。

2 个答案:

答案 0 :(得分: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.从你的问题中很难说出来。

答案 1 :(得分:1)

使用UPDATE中的模型类,您可以尝试此映射:

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

映射意味着用户可以拥有成员资格(不超过一个),但不是必需的(HasOptional / 0..1)。另一方面,成员资格必须只有一个相关用户(WithRequired / 1)。

在ASP.NET成员资格表中,User表表示具有关系主键的主体,Membership表是与外键相关的表。但是外键是同时UserId表的主键(Membership)。因此,这种关系是共享的主键一对一关系。您必须使用上面的映射明确定义它,否则默认情况下EF会推断出模型中的一对多关系。