在 asp.net 身份中配置一对一关系

configuring one to one relationship in asp.net identity

这是我的 ApplicationUser class.I 只添加了一个新的 属性 ----

   public class ApplicationUser : IdentityUser
   {
    //public ApplicationUser()
    //{
    //    UserProfileInfo = new UserProfileInfo { ImageSize = 0, FileName = null, ImageData = 0 };
    //}
    public string HomeTown { get; set; }
    public virtual UserProfileInfo UserProfileInfo { get; set; }

这是我的 userProfileInfo class 我想在每个用户完成注册后保存他们的个人资料照片----

  public class UserProfileInfo
  { 
   // [Key, ForeignKey("ApplicationUser")]
    [Key]
    public int Id { get; set; }
    public int ImageSize { get; set; }
    public string FileName { get; set; }
    public byte[] ImageData { get; set; }

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

这是我的 DbContext class -----

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

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

现在,问题是我无法配置 ApplicationUser class 和 UserProfileInfo class.I 之间的一对一关系,我已经尝试了各种方法来做到这一点,并遵循了一些先前提出的堆栈溢出问题但是在我完成注册表后,它显示错误------

无法确定类型 'CodeFirstContext.ApplicationUser' 和 'CodeFirstContext.UserProfileInfo' 之间关联的主体端。此关联的主体端必须使用流畅的关系 API 或数据注释进行显式配置。

我也试过在流利的帮助下建立关系api-----

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       // base.OnModelCreating(modelBuilder);

        //// Configure Id as PK for UserProfileInfo class
        modelBuilder.Entity<UserProfileInfo>()
            .HasKey(e => e.Id);

        // Configure Id as FK for UserProfileInfo
        modelBuilder.Entity<ApplicationUser>()
            .HasOptional(s => s.UserProfileInfo)
            .WithRequired(ad => ad.ApplicationUser);
    }

这样我也failed.Please建议我如何配置它。

你快到了。 首先,您可以删除属性(键、外键)上的所有注释,因为按照惯例,ef 会将名称为 Id 的列作为主键(并且您的关系再次与此相关)。

其次,您只需要从一个实体流畅地映射您的关系,例如从 Applicationuser 到 UserProfileInfo,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ApplicationUser>()
            .HasOptional(c => c.UserProfileInfo)
            .WithRequired(d => d.ApplicationUser);
        base.OnModelCreating(modelBuilder);
    }

注意:如果您的配置文件关系是可选的,则使用此选项,否则使用 HasRequired。 如果您现在想为用户添加配置文件设置,您可以:

var user = UserManager.FindById(User.Identity.GetUserId());
var up = new UserProfileInfo {ImageSize = 12};
user.UserProfileInfo = up;
UserManager.Update(user);

更多关于 ef fluent 映射的信息:https://msdn.microsoft.com/en-us/data/hh134698.aspx

编辑: 要将 UserProfileInfo 分配给 ApplicationUser,您可以:

1

// get user via UserManager
var user = UserManager.FindById(User.Identity.GetUserId());
// create new UserProfileInfo
var up = new UserProfileInfo {ImageSize = 12};
// assign UserProfileInfo to user, ef will figure out that this info goes into the corresponding UserProfileInfo table
user.UserProfileInfo = up;
// update via UserManager
UserManager.Update(user);

或 2.

// logged in user id
var userId = User.Identity.GetUserId();
using (var db = new ApplicationDbContext())
{
     // get user from context
     var user = db.Users.First(c => c.Id == userId);
     // new UserProfileInfo
     var up = new UserProfileInfo {ImageSize = 12};'
     // assign UserProfileInfo to user
     user.UserProfileInfo = up;
     // save changes
     db.SaveChanges();
 }

最后,如果您想更新 userprofileinfo 而不是总是创建一个新的。你可以这样做:

// get existing or create new UserProfileInfo
var up = user.UserProfileInfo ?? new UserProfileInfo();
// update with new values 
up.ImageSize = 17;

请注意,您无需关心外键 ApplicationUser_Id,当您将 UserProfileInfo 分配给 ApplicationUser 时,EF 会自行解决此问题。

并且:如果您绝对想在 UserProfileInfo 中公开 ApplicationUser 的外键。您可以在 class UserProfileInfo 中添加一个名为 ApplicationUserId 的 属性。按照惯例,Ef 理解这一点。如果您需要为此外键使用不同的名称,您可以使用 .HasForeignKey(fk=>fk.YourForeignKeyPropertyHere)

扩展流畅的映射