在 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)
扩展流畅的映射
这是我的 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)
扩展流畅的映射