我正在项目中使用IdentityUser类的自定义实现
问题是实体框架在表 IdentityUserRoles 中添加了一个额外的列,将子类ID映射为约束。
我知道EF可能会对如何映射这个新类的关系感到困惑,我只是不知道为什么以及如何解决它。我一直在网上搜索这个EF行为,但还没找到解决方案。
以下是一些总结问题的截图:
答案 0 :(得分:2)
所以,我已经重新检查了我的数据库映射,我想我找到了解决这个问题的方法:
我的用户类映射位于另一个从EntityTypeConfiguration继承的文件(UsuarioMap)中,然后我会在其构造函数中指定我的配置,就像帖子中的图像一样。 (恕我直言,这对代码组织来说更好)。现在我的IdentityUser(Usuario)表配置它只是位于 OnModelCreating 方法内:
modelBuilder.Entity<Usuario>().ToTable("Usuario");
modelBuilder.Entity<Usuario>().Property(u => u.UserName).IsRequired();
modelBuilder.Entity<Usuario>().Property(u => u.Email).IsRequired();
modelBuilder.Entity<Usuario>().Property(u => u.PasswordHash).IsRequired();
modelBuilder.Entity<Usuario>().Property(u => u.Nome).IsRequired();
modelBuilder.Entity<Usuario>().Property(u => u.DataRegistro).IsRequired();
modelBuilder.Entity<Usuario>().Property(u => u.UltimoLogin).IsOptional();
modelBuilder.Entity<Usuario>().HasOptional(u => u.Cliente).WithMany(c => c.Usuarios);
老实说,我不知道为什么实体框架会因为 modelBuilder.Configurations.Add()的参数和 modelBuilder.Entity的返回而以不同的方式看待这两种配置路径)是 System.Data.Entity.ModelConfiguration.EntityTypeConfiguration 对象,因此逻辑上两种方式都应该有效。
答案 1 :(得分:0)
无法提供完整的技术说明,但我在代码中进行了这些更改以克服此问题:
public class ResultzContext : IdentityDbContext<ApplicationUser>
{
public ResultzContext()
: base("ResultzConnection")
{
}
static ResultzContext()
{
// Set the database intializer which is run once during application start
// This seeds the database with admin user credentials and admin role
Database.SetInitializer<ResultzContext>(new ApplicationDbInitializer());
}
public static ResultzContext Create()
{
return new ResultzContext();
}
: :
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).ToTable("AspNetRoles");
//modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers");
modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers");
//modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).ToTable("AspNetUserLogins");
//modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }).ToTable("AspNetUserRoles");
//modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");
因此,通常会注释掉所有内容并从IdentityUser更改为ApplicationUser。但需要补充一点,我原来拥有Identity 1.0的代码 希望它可以帮到你!
答案 2 :(得分:0)
我发现了同样的问题。有一个更简单的解决方案。您应该在IdentityUserRole配置上明确定义关系。
E.g:
public class UserRoleConfiguration : EntityTypeConfiguration<UserRole>
{
public UserRoleConfiguration()
{
HasKey(x => new {x.UserId, x.RoleId});
HasRequired(x => x.User).WithMany(x => x.Roles).WillCascadeOnDelete();
}
}