AspNetUser 1:n关系

时间:2015-01-23 09:59:56

标签: c# asp.net-mvc asp.net-mvc-5

我想在AspNetUser和Movie之间建立一个1:n的关系,这样一个用户可以拥有很多电影。

因此我添加了以下内容:

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<Movie> Movies{ get; set; } 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    public DbSet<Movie> Movie { get; set; }
}

但现在我遇到的问题是我无法引用AspNetUser,因为没有AspNetUserModel。

public partial class Movie
{
    public long MovieId { get; set; }

    [Required]
    [StringLength(100)]
    public string name { get; set; }
}

因此,当我现在创建数据库时,Movie表具有主键ID,属性Name和与AspNetUser Id关系的外键ApplicationUser_Id。

所以基本上我得到了我想要的东西,但是我现在如何才能访问这个属性,因为在我的模型中我想念它。

2 个答案:

答案 0 :(得分:1)

试试这个:

public partial class Movie
{
     public long MovieId { get; set; }

     [Required]
     [StringLength(100)]
     public string name { get; set; }

     [Required]
     public string UserId { get; set; }

     [ForeignKey("UserId")]
     public virtual ApplicationUser Owner {set;get;}
}

实际上,重点在于您无法将导航属性设置为“必需”,因为它是EF为您解析的内容,而不是DB中的字段。这就是为什么你需要将FK属性设置为required并将其与导航属性([ForeignKey()]属性)连接起来

答案 1 :(得分:0)

我稍微调整了你的解决方案,现在它可以工作......

public partial class Movie
{
public long MovieId { get; set; }

[Required]
[StringLength(100)]
public string name { get; set; }

[ForeignKey("Owner")]
public string OwnerID { get; set; }

public virtual ApplicationUser Owner {set;get;}
}

不幸的是,当我支撑模型时,它会创建一些

ViewBag.OwnerID = new SelectList(db.ApplicationUsers, "Id", "Email", film.OwnerID);

但ApplicationDbContext不包含db.ApplicationUsers,因此会抛出错误。因此,他将其改为。

ViewBag.OwnerID = new SelectList(db.Users, "Id", "Email");

现在它有效....