在 ASP.NET Core IdentityDbContext 中,我使用的是 EF Code First。我有:
public class DDMDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long, IdentityUserClaim<long>, ApplicationUserRole, IdentityUserLogin<long>, IdentityRoleClaim<long>, IdentityUserToken<long>>
{
public DDMDbContext(DbContextOptions<DDMDbContext> options)
: base(options) { }
public virtual DbSet<ApplicationRole> ApplicationRole { get; set; }
public virtual DbSet<ApplicationUserRole> ApplicationUserRole { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUserRole>(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
userRole.HasOne(ur => ur.User)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
}
}
namespace DDM.API.Core.Data.Identity
{
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
public class ApplicationRole : IdentityRole
{
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
public class ApplicationUserRole : IdentityUserRole<long>
{
public virtual ApplicationUser User { get; set; }
public virtual ApplicationRole Role { get; set; }
}
}
我發現在 ApplicationUser 中,這些欄位是必需的。:
EmailConfirmed
PhoneNumberConfirmed
TwoFactorEnabled
LockoutEnabled
AccessFailedCount
我嘗試使用:
entity.Property(m => m.EmailConfirmed).IsRequired(false);
entity.Property(m => m.PhoneNumberConfirmed).IsRequired(false);
entity.Property(m => m.TwoFactorEnabled).IsRequired(false);
entity.Property(m => m.LockoutEnabled).IsRequired(false);
entity.Property(m => m.AccessFailedCount).IsRequired(false);
但得到錯誤:
屬性“ApplicationUser.EmailConfirmed”不能標記為可為空/可選,因為該屬性的型別是“bool”,它不是可空型別。任何屬性都可以標記為不可空/必需,但只有可空型別的屬性才能標記為可空/可選。
如何將這些欄位更改為Not required?
謝謝
uj5u.com熱心網友回復:
您應該保留這些屬性,只需在登錄、鎖定等時忽略它們。查看這篇文章:https : //docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-configuration? view=aspnetcore-6.0 因此,對于登錄,您可以使用:
services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
其余的屬性可以被類似的邏輯忽略。
uj5u.com熱心網友回復:
EmailConfirmed
PhoneNumberConfirmed
TwoFactorEnabled
LockoutEnabled
AccessFailedCount
這些屬性IdentityRole<>在 .Net Identity的根級別進行了硬編碼,帶有 type bool,bool?因此即使我們通過 fluent API 配置它也不能是可選的。
如何將這些欄位更改為不需要?
到目前為止我不明白......如果我們不需要它,為什么不簡單地忽略它?就像我們通常對userRole.Ignore(x => x.EmailConfirmed);. 但是將其覆寫為可選并沒有多大意義。
只是一個警告,UserManager,LoginManager和幾個經理曾經它利用這些屬性會得到它們的默認值(例如,bool忽略總是有屬性false值),則可能會導致以后一些意外行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371321.html
上一篇:APIUri未映射到控制器
