1

模型类:

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; }
}

数据库上下文

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 表。我该怎么做?

但更重要的是,我真的找不到好的实体框架教程,有什么建议吗?

- 更新 -

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,只是想用一些简单的代码让我的手“变脏”。

4

2 回答 2

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。从您的问题中很难判断。

于 2012-07-27T17:42:36.953 回答
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表用外键表示依赖。但外键同时是表的主键(UserIdMembership。因此,该关系是共享主键一对一的关系。您必须使用上面的映射显式定义它,否则默认情况下 EF 会从您的模型中推断出一对多的关系。

于 2012-07-28T10:50:50.763 回答