这是什么类型的关系,应该如何配置?

What type of relationship is this and how should it be configured?

我正在尝试使用 Identity 创建一个讨论区,ApplicationUsers 可以在其中创建、保存、隐藏和评论 Post。我能够在没有数据注释或覆盖 OnModelCreating 的情况下获得 Posts 和评论,如下所示:

Post.cs:

public class Post
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        [DataType(DataType.DateTime)]
        public DateTime CreationDate { get; set; }
        public ApplicationUser OriginalPoster { get; set; }
        public int Upvotes { get; set; }
        public int Downvotes { get; set; }
        public int VoteScore { get; set; }
        public ICollection<Comment> Comments { get; set; }
    }

Comment.cs:

public class Comment
    {
        public int ID { get; set; }
        public string Content { get; set; }
        public ApplicationUser Commenter { get; set; }
        [DataType(DataType.DateTime)]
        public DateTime CreationDate { get; set; }
        public int Upvotes { get; set; }
        public int Downvotes { get; set; }
        public int VoteScore { get; set; }
    }

ApplicationDbContext.cs:

public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        public DbSet<Post> Posts { get; set; }
        public DbSet<Comment> Comments { get; set; }
    }

但是当我扩展 IdentityUser 以添加我自己的自定义字段时:

public class ApplicationUser : IdentityUser
    {
        public ICollection<Post> CreatedPosts { get; set; }
        public ICollection<Post> SavedPosts { get; set; }
        public ICollection<Post> HiddenPosts { get; set; }
    }

添加迁移 returns 错误:

"Unable to determine the relationship represented by navigation 'ApplicationUser.CreatedPosts' of type 'ICollection'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'."

为什么 EF Core 能够确定 Post 与其 Comments 之间的关系,但不能确定 ApplicationUser 与其 created/saved/hidden Post 之间的关系?我知道我必须通过使用数据注释或覆盖 OnModelCreating 来指定关系,但我不确定如何去做。非常感谢任何帮助。

原因是因为您有多个 collection 属性引用同一模型 Post。这种情况需要明确告诉 EF Core CreatedPostsHiddenPostsSavedPosts 中的哪些外部属性要从 Post 中引用。鉴于您只有一个 ApplicationUser 外国 属性 名为 OriginalPoster,这是不可能的,因为没有其他属性 HiddenPostsSavedPosts 可以引用。您只能通过这样配置来引用一个。

builder.Entity<ApplicationUser>().HasMany(s => s.CreatedPosts)
    .WithOne(f => f.OriginalPoster);

现在,其他两个(HiddenPostsSavedPosts)引用了哪些属性?我希望你能看到这里的问题。

但假设您在 Post 模型中定义了另一种类型的 poster,就像这样。

public ApplicationUser HiddenPoster {get;set;} 

你把它所属的 collection 也引用了。

builder.Entity<ApplicationUser>().HasMany(s => s.HiddenPosts)
    .WithOne(f => f.HiddenPoster);

但你没有,所以这种方法行不通,因为它只是你 Post 中的一种 poster。我建议你重新定义你的模型,在 Post 中有一个枚举值 CreatedHiddenSaved.

public enum PostStatus
{
    Created,
    Hidden,
    Saved
}

然后像这样在Post模型中定义状态。

public PostStatus Status {get;set;}

所以在你的ApplicationUser中,你不必定义多个collection,你只有Posts;

public class ApplicationUser : IdentityUser
{ 
    public ICollection<Post> Posts {get;set;}
}

然后您可以使用 Post.

中的 Status 枚举 属性 过滤创建、隐藏或保存的 post