这是什么类型的关系,应该如何配置?
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 CreatedPosts
、HiddenPosts
和 SavedPosts
中的哪些外部属性要从 Post
中引用。鉴于您只有一个 ApplicationUser
外国 属性 名为 OriginalPoster
,这是不可能的,因为没有其他属性 HiddenPosts
和 SavedPosts
可以引用。您只能通过这样配置来引用一个。
builder.Entity<ApplicationUser>().HasMany(s => s.CreatedPosts)
.WithOne(f => f.OriginalPoster);
现在,其他两个(HiddenPosts
和 SavedPosts
)引用了哪些属性?我希望你能看到这里的问题。
但假设您在 Post
模型中定义了另一种类型的 poster,就像这样。
public ApplicationUser HiddenPoster {get;set;}
你把它所属的 collection 也引用了。
builder.Entity<ApplicationUser>().HasMany(s => s.HiddenPosts)
.WithOne(f => f.HiddenPoster);
但你没有,所以这种方法行不通,因为它只是你 Post
中的一种 poster。我建议你重新定义你的模型,在 Post
中有一个枚举值 Created
、Hidden
和 Saved
.
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
我正在尝试使用 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 CreatedPosts
、HiddenPosts
和 SavedPosts
中的哪些外部属性要从 Post
中引用。鉴于您只有一个 ApplicationUser
外国 属性 名为 OriginalPoster
,这是不可能的,因为没有其他属性 HiddenPosts
和 SavedPosts
可以引用。您只能通过这样配置来引用一个。
builder.Entity<ApplicationUser>().HasMany(s => s.CreatedPosts)
.WithOne(f => f.OriginalPoster);
现在,其他两个(HiddenPosts
和 SavedPosts
)引用了哪些属性?我希望你能看到这里的问题。
但假设您在 Post
模型中定义了另一种类型的 poster,就像这样。
public ApplicationUser HiddenPoster {get;set;}
你把它所属的 collection 也引用了。
builder.Entity<ApplicationUser>().HasMany(s => s.HiddenPosts)
.WithOne(f => f.HiddenPoster);
但你没有,所以这种方法行不通,因为它只是你 Post
中的一种 poster。我建议你重新定义你的模型,在 Post
中有一个枚举值 Created
、Hidden
和 Saved
.
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