当我尝试注册用户或创建迁移时,我收到以下错误:
“无法在'ApplicationUser'上配置密钥,因为它是a 派生类型。必须在根类型上配置密钥 'IdentityUser'。如果您不打算使用'IdentityUser' 包含在模型中,确保它不包含在DbSet中 您在上下文中的属性,在配置调用中引用 模型构建器,或从类型上的导航属性引用 包含在模型中。“
我有一个BaseEntity,所有东西都是这样的:
public class BaseEntity
{
public int Id { get; set; }
[Required]
public DateTime DateCreated { get; set; }
[Required]
public DateTime DateModified { get; set; }
[Required]
public string CreatedById { get; set; }
[Required]
public string ModifiedById { get; set; }
public virtual IdentityUser CreatedBy { get; set; }
public virtual IdentityUser ModifiedBy { get; set; }
}
public class FilePath : BaseEntity, IAuditable
{
[StringLength(255)]
public string FileName { get; set; }
public FileType FileType { get; set; }
}
是否有新规则或更新表明您无法将IdentityUser用作导航属性?谷歌没有带来太多有用的信息。
整个解决方案是here 如果需要的话。
更新:升级到2.0.1预览后,错误会更有帮助:
外键属性{'Id':string}的最佳匹配是 与主键{'Id':int}不兼容。
答案 0 :(得分:0)
重新。 “外键属性的最佳匹配{'Id':string} ...”
您的ApplicationUser
类未指定其Id字段的类型。在这种情况下,它默认为string
。你可以做什么 - 虽然这会导致你重建你的数据库,所以现在可能太晚了 - 是明确键入ApplicationUser
:
public class ApplicationUser: IdentityUser<int>
{
// myUser.Id is now an int
}
答案 1 :(得分:0)
我遇到了同样的问题。您需要替换使用BaseEntity到FilePath的代码中的所有位置。
示例: 我的继承像:
public class ApplicationUser : IdentityUser
{
}
然后我将ApplicationDbContext更改为:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
但是我遇到了同样的异常。
在代码中将IdentityUser替换为ApplicationUser后,错误消失了。我认为您应该在数据访问层中使用BaseEntity
至FilePath
。