EF Core 2.0.1使用IdentityUser作为导航属性

时间:2018-03-03 20:53:06

标签: asp.net asp.net-mvc entity-framework entity-framework-core

当我尝试注册用户或创建迁移时,我收到以下错误:

  

“无法在'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}不兼容。

2 个答案:

答案 0 :(得分:0)

重新。 “外键属性的最佳匹配{'Id':string} ...”

您的ApplicationUser类未指定其Id字段的类型。在这种情况下,它默认为string。你可以做什么 - 虽然这会导致你重建你的数据库,所以现在可能太晚了 - 是明确键入ApplicationUser

public class ApplicationUser: IdentityUser<int>
{
    // myUser.Id is now an int
}

IdentityUser docs

答案 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后,错误消失了。我认为您应该在数据访问层中使用BaseEntityFilePath