Asp.net mvc MVC 3实体框架键的简单映射

Asp.net mvc MVC 3实体框架键的简单映射,asp.net-mvc,entity-framework,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_Me

模型类:

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 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
...
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.UserName)
@DisplayFor(modelItem=>item.asp\u Membership.CreateDate)
}

我所要做的就是找出如何从默认的aspnetdb连接两个单独的表“aspnet\u Users”和“aspnet\u Membership”。如模型类中所述,它们都有“UserId”列。我知道这是一个简单的问题,很抱歉让人困惑。正如你可能知道的,我刚刚开始使用EF,我只是想用一些简单的代码来“弄脏”我的手。

你就快到了。试试这个:

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

使用更新中的模型类,您可以尝试以下映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasOptional(u => u.asp_membership)
        .WithRequired();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HAS可选(u=>u.asp\u成员资格)
.WithRequired();
}
映射意味着用户可以拥有一个成员身份(不超过一个),但不是必需的(
haseoptional
/
0..1
)。另一方面,成员资格必须始终只有一个相关用户(
WithRequired
/
1


在ASP.NET成员资格表中,
用户
表用关系的主键表示主体,
成员资格
表用外键表示从属关系。但是外键同时是
成员资格
表的主键(
UserId
)。因此,这种关系是一种共享主键一对一的关系。您必须使用上面的映射显式地定义它,否则默认情况下EF将从您的模型中推断出一对多关系。

我现在收到一个错误:“无效的列名asp\U membership\U UserId.”基本上我要做的是查看一个包含列“UserName”和“CreateDate”的表,因此当我将Users.ToList()传递给视图时,我发现了这个错误,所以在您的Asp\U成员资格表中没有一个名为UserId的列?没有,db只是aspnetDB。这无法工作,因为您没有定义Asp\U成员资格。user是否属于
user.CreateDates
user.Asp\u成员资格
。因此EF假设有三个关系和一个默认外键用于
User.asp\u membership
,即不存在的NavigationPropertyName\u KeyNameInTargetClass=“asp\u membership\u UserId”=异常。我会试着回答我自己,但我真的不明白这个集合的目的…为什么一个用户有一个成员资格集合,为什么他们被称为CreateDates?这是一个非常好的问题,检查更新的codeWow就是这样。感谢Slauma的回复。顺便问一下,你对一些教程有什么建议吗?还有,@Slauma,你怎么知道成员表是外键依赖的?@theStig:12部分教程关于
DbContext
:然后是Julie Lerman的两本书(我没有读过,但是所有推荐过这两本书的人都读过):我通过查看一个数据库找到了依赖项,该数据库包含ASP.NET成员表->打开用户和成员表之间的关系->FK在成员表中,PK在用户表中。
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;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasOptional(u => u.asp_membership)
        .WithRequired();
}