Я создал Статья Модель с полем ArticleAuthors :
public virtual ICollection<ArticleAuthor> ArticleAuthors
{
get; set;
}
Я хочу настроить Много-ко-многим
Класс ArticleAuthor определяется следующим образом:
public class ArticleAuthor : BaseEntity
{
public Guid ArticleId { get; set; }
public Article Article { get; set; }
public Guid AuthorId { get; set; }
public Author Author { get; set; }
}
Автор Класс
public class Author : BaseEntity
{
public string Name { get; set; }
public string Email { get; set; }
public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}
И BaseEntity
public class BaseEntity
{
public Guid ID { get; set; }
[Timestamp]
public byte[] Timestamp { get; set; }
public BaseEntity()
{
ID = Guid.NewGuid();
}
}
Отношение Многие ко многим определяется с помощью Fluent API
modelBuilder.Entity<ArticleAuthor>()
.HasKey(bc => new {bc.ArticleId, bc.AuthorId});
modelBuilder.Entity<ArticleAuthor>()
.HasOne(bc => bc.Article)
.WithMany(b => b.ArticleAuthors)
.HasForeignKey(bc => bc.ArticleId);
modelBuilder.Entity<ArticleAuthor>()
.HasOne(bc => bc.Author)
.WithMany(c => c.ArticleAuthors)
.HasForeignKey(bc => bc.AuthorId);
Я определил веб-сервис для загрузки Article
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesDefaultResponseType]
public async Task<ActionResult<Article>> GetArticle([FromRoute] Guid id)
{
Article article = await _dbContext.Articles
.Include(x => x.MainPictureFile)
.FirstOrDefaultAsync(x => x.ID == id);
if (article == null)
{
return NoContent();
}
return Ok(article);
}
Работает отлично, пока я не попытаюсь загрузить поле ArticleAuthors , используя EagerLoading
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesDefaultResponseType]
public async Task<ActionResult<Article>> GetArticle([FromRoute] Guid id)
{
Article article = await _dbContext.Articles
.Include(x => x.MainPictureFile)
.Include(x => x.ArticleAuthors)
.FirstOrDefaultAsync(x => x.ID == id);
if (article == null)
{
return NoContent();
}
return Ok(article);
}
Когда ядля этого возвращаемый JSON обрезается после articleId :
{"title":"Editorial updated","chapo":null,"body":null,"readingTime":null,"edition":null,"date":null,"theme":null,"articleAuthors":[{"articleId":"d4ef0cfe-0b7b-4432-a099-75a221c2258b"
И возникает исключение
Newtonsoft.Json.JsonSerializationException: цикл самоссылкиобнаружен для свойства 'article' с типом 'ReylNewsletterCMSBack.Article'.Путь 'articleAuthors [0]'
Я использовал эту статью для настройки своего отношения «многие ко многим»: https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
Как мне загрузить ArticleAuthors и сохранить JSON?