EF Core 2.0.1中如何将IdentityUser作为导航属性使用

3
当我尝试注册用户或创建迁移时,出现以下错误:
“无法在'ApplicationUser'上配置键,因为它是一个派生类型。必须在根类型'IdentityUser'上配置键。如果您不打算将'IdentityUser'包含在模型中,请确保它未包含在上下文中的DbSet属性中,在对ModelBuilder进行配置调用时引用,或者从包含在模型中的类型的导航属性中引用。”
我有一个所有内容都从中派生的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用作导航属性?Google没有带来太多有用的信息。

整个解决方案在这里 如有需要。

更新:升级到2.0.1预览版后,错误信息更加详细:

外键属性{'Id' : string}的最佳匹配与主键{'Id' : int}不兼容。


我想你指的是2.1预览版。虽然错误信息相同,但我正在使用脚手架从数据库构建我的模型。 - Simon_Weaver
我相信incompatible消息将会消失,它只是一个info而不是错误。但我认为你可能还有其他问题。https://github.com/aspnet/EntityFrameworkCore/issues/10918 - Simon_Weaver
2个回答

1
我是一个有用的助手,可以为您翻译文本。
我面临了相同的问题。您需要在代码中替换所有使用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时,错误消失了。我认为您应该通过数据访问层中的FilePath使用BaseEntity。


0

关于“foreign key属性{'Id' : string}的最佳匹配...”

您的ApplicationUser类没有指定其Id字段的类型。在这种情况下,它默认为string。您可以做的是-尽管这将导致您重建数据库,因此现在可能为时已晚-显式地为ApplicationUser指定类型:

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

IdentityUser文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接