在我的CMS / CRM系统中,Article
类具有三个AdminUser
属性,一个属性用于“创建者”,一个属性用于“编辑者”,另一个属性用于“发布者”:< / p>
public class Article
{
public int Id { get; set; }
// some more properties ...
public AdminUser CreatedBy { get; set; }
public AdminUser EditedBy { get; set; }
public AdminUser PublishedBy { get; set; }
}
AdminUser
级:
public class AdminUser
{
public int Id { get; set; }
public int MemberId { get; set; }
// some more properties ...
public Member Member { get; set; }
}
(Member
类仅包含个人信息,例如姓名等。在我的系统中,并非所有成员都是管理员,但是所有管理员都是成员。)
当我在Article
类中没有任何对AdminUser
的引用时,此方法很好用。但是,如果我想对管理员创建,编辑或发布的文章有任何了解,则它们必须属于AdminUser
类的一部分:
public class AdminUser
{
public int Id { get; set; }
// ... and the rest of the properties
public List<Article> CreatedArticles { get; set; }
public List<Article> EditedArticles { get; set; }
public List<Article> PublishedArticles { get; set; }
}
现在,当尝试进行add-migration
时,出现以下错误消息:
无法确定类型为“列表”的导航属性“ AdminUser.Articles”表示的关系。要么手动配置关系,要么使用“ [NotMapped]”属性或“ OnModelCreating”中的“ EntityTypeBuilder.Ignore”忽略此属性。
我有点理解发生了什么,但是我不知道如何“手动配置关系”。
答案 0 :(得分:2)
按如下所示创建Article
Fluent API配置:
public class ArticleConfiguration : IEntityTypeConfiguration<Article>
{
public void Configure(EntityTypeBuilder<Article> builder)
{
builder.HasOne(a => a.CreatedBy).WithMany(au => au.CreatedArticles);
builder.HasOne(a => a.EditedBy).WithMany(au => au.EditedArticles);
builder.HasOne(a => a.PublishedBy).WithMany(au => au.PublishedArticles);
}
}
然后在OnModelCreating
的{{1}}中进行如下操作:
DbConetxt
答案 1 :(得分:1)
或者您可以在SQL中添加一个名为 author 的表并将其分配给 (id,author.Id,author_job,article_id) 然后在工作中,您可以决定作者对该文章做了什么
答案 2 :(得分:1)
您需要分配AdminUser
和Article
之间的关系。您可以使用Has/With pattern来配置Fluent API的关系。在您的dbcontext中,添加关系:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AdminUser>()
.HasMany(c => c.EditedArticles)
.WithOne(e => e.EditedBy);
modelBuilder.Entity<AdminUser>()
.HasMany(c => c.CreatedArticles)
.WithOne(e => e.CreatedBy);
modelBuilder.Entity<AdminUser>()
.HasMany(c => c.PublishedArticles)
.WithOne(e => e.PublishedBy);
}