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");
现在可以使用了....
我想在 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");
现在可以使用了....