Как я могу связать трех разных администраторов к статье? - PullRequest
0 голосов
/ 04 апреля 2019

В моей CMS / CRM-системе класс Article имеет три свойства AdminUser, одно для «создано», одно для «отредактировано» и одно для «опубликовано»:

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] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.

Я вроде понимаю, что происходит, но я не знаю, как "вручную настроить отношения".

Ответы [ 3 ]

2 голосов
/ 04 апреля 2019

Создайте свою Article Свободную конфигурацию 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 из DbConetxt следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);
     modelBuilder.ApplyConfiguration(new ArticleConfiguration());
}
1 голос
/ 04 апреля 2019

Вам необходимо назначить отношения между AdminUser и Article.Вы можете использовать Имеет / С шаблоном для настройки отношений с 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);
}
1 голос
/ 04 апреля 2019

Или вы можете добавить таблицу в вашем sql с именем author и дать ей (id, author.Id, author_job, article_id) тогда в работе вы можете решить, что этот автор сделал со статьей

...