AspNetUser 1:n 关系

AspNetUser 1:n Relationship

我想在 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; }
}

所以当我现在创建数据库时,电影 table 有一个主键 ID、一个属性名称和一个与 AspNetUser Id 相关的外键 ApplicationUser_Id。

所以基本上我得到了我想要的东西,但我现在如何访问它 属性 因为在我的模型中我错过了它。

试试这个:

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

实际上,关键是您不能将导航 属性 设置为 "required",因为这是 EF 为您解决的问题,而不是数据库中的一个字段。这就是为什么您需要将 FK 属性 设置为必需并将其与导航 属性 ([ForeignKey()] 属性)

连接起来

我稍微调整了您的解决方案,现在可以使用了...

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");

现在可以使用了....