如何在Application Layer实现Create with child collection?

How to implement Create with child collection in Application Layer?

我在 .Core 项目中有 2 个名为 NewsNewsAttachment 的实体。这些实体通过 News_Id 建立了关系。换句话说,当我创建新的 News 并将其添加到数据库中时,这个 News 可能有一个或两个我想插入到名为 [=16= 的相关 table 中的附件媒体].所以我可能想检索 News_Id 并在相关的 table.

中插入附件

我在 NewsAppService 中定义了两个名为 NewsDtoCreateNewsDto 的 DTO,我通过 CreateNewsDto 插入新的 News,但我不知道如何NewsAttachment.

这是我的 News 实体:

public class News : FullAuditedEntity<long>
{
    public const int MaxTitleLength = 150;
    public const int MaxContentLength = 1200;
    public const int MaxMetaTagLength = 60;

    [Required]
    [MaxLength(MaxTitleLength)]
    public string Title { get; set; }

    [Required]
    public string Code { get; set; }

    [Required]
    [MaxLength(MaxContentLength)]
    public string Content { get; set; }

    public DateTime PublishDate { get; set; }

    [MaxLength(MaxMetaTagLength)]
    public string Tags { get; set; }

    public virtual NewsType Type { get; set; }

    public virtual ICollection<NewsAttachment> Attachments { get; set; }
}

NewsAttachment实体:

public class NewsAttachment: FullAuditedEntity<long>
{
    public const int MaxTitleLength = 50;

    [Required]
    [MaxLength(MaxTitleLength)]
    public string FileName { get; set; }

    [Required]
    public byte[] File { get; set; }
    public string FileExtension { get; set; }
    public int FileSize { get; set; }

    [Required]
    public DateTime RegisterDate { get; set; }

    public virtual News News { get; set; }
}

和 DTO:

public class NewsDto : EntityDto<long>
{
    public const int MaxTitleLength = 50;
    public const int MaxContentLength = 800;
    public const int MaxMetaTagLength = 60;

    [Required]
    [MaxLength(MaxTitleLength)]
    public string Title { get; set; }

    [Required]
    public string Code { get; set; }

    [Required]
    [MaxLength(MaxContentLength)]
    public string Content { get; set; }

    public DateTime PublishDate { get; set; }

    [MaxLength(MaxMetaTagLength)]
    public string Tags { get; set; }

    public virtual NewsType Type { get; set; }
}

和:

public class CreateNewsDto
{
    public const int MaxTitleLength = 50;
    public const int MaxContentLength = 800;
    public const int MaxMetaTagLength = 60;

    [Required]
    [MaxLength(MaxTitleLength)]
    public string Title { get; set; }

    [Required]
    public string Code { get; set; }

    [Required]
    [MaxLength(MaxContentLength)]
    public string Content { get; set; }

    public DateTime PublishDate { get; set; }

    [MaxLength(MaxMetaTagLength)]
    public string Tags { get; set; }

    public virtual NewsType Type { get; set; }

    public virtual ICollection<NewsAttachment> Attachments { get; set; }
}

这是我在 NewsAppService 中插入新 News 并将相关媒体添加到 NewsAttachment 的推定方法 table:

public virtual NewsDto InsertWithMedia(CreateNewsDto input, NewsAttachmentDto attach)
{
   var news = ObjectMapper.Map<NewsManagement.News>(input);

    var newsAttachment = ObjectMapper.Map<NewsAttachment>(attach);
    newsAttachment.News.Id = news.Id;
    return MapToEntityDto(news);
}

两个选择:

  1. 添加到 ICollection 并让 EF 处理实体:
public virtual NewsDto InsertWithMedia(CreateNewsDto input, NewsAttachmentDto attach)
{
    var news = ObjectMapper.Map<NewsManagement.News>(input);
    news.Attachments = new List<NewsAttachment>(); // 1

    var newsAttachment = ObjectMapper.Map<NewsAttachment>(attach);
    news.Attachments.Add(newsAttachment);          // 2

    _newsRepository.Insert(news);                  // 3
    CurrentUnitOfWork.SaveChanges();               // 4

    return MapToEntityDto(news);
}
  1. 通过Id而不是集合添加,使用外键:
public class NewsAttachment: FullAuditedEntity<long>
{
    // ...

    public virtual long NewsId { get; set; }
    public virtual News News { get; set; }
}
public virtual NewsDto InsertWithMedia(CreateNewsDto input, NewsAttachmentDto attach)
{
    var news = ObjectMapper.Map<NewsManagement.News>(input);
    var newsId = _newsRepository.InsertAndGetId(news); // 1

    var newsAttachment = ObjectMapper.Map<NewsAttachment>(attach);
    newsAttachment.NewsId = newsId;                    // 2

    _newsAttachmentRepository.Insert(newsAttachment);  // 3
    CurrentUnitOfWork.SaveChanges();                   // 4

    return MapToEntityDto(news);
}

第二个适用于更新 — 当 newsId 已知时 — 但如果 NewsDto 也有 Attachments(应该是 ICollection<AttachmentDto> 类型,则可能需要额外的步骤).

谢谢@aaron。毕竟,我有点问题。在 .WebMpa 项目中,我如何检索具有相关 picture.I 的新闻 在模型文件夹中定义 NewsViewModel 并使用 Auto Mapper library.and 将此 ViewModel 映射到 NewsDto 在 NewsController 中调用 NewsAppService 和从 database.I 获取新闻的 GetAll 方法有 2 种情况: 1- 我认为在 .Application 项目中更改此方法并添加一些 linq 查询以从 NewsAttachment 获取带有相关图片的新闻 2- 所有关于 News 和 NewsAttachment 的操作以及与两个实体的连接都留在 .WebMpa 项目和 NewsController 中。 我搞糊涂了 really.would 你能帮我举个例子吗?