如何将三个不同的管理员用户链接到文章?

时间:2019-04-03 22:21:04

标签: c# asp.net-core database-design entity-framework-core code-first

在我的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”忽略此属性。

我有点理解发生了什么,但是我不知道如何“手动配置关系”。

3 个答案:

答案 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)

您需要分配AdminUserArticle之间的关系。您可以使用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);
}