如何在Application Layer中实现使用子集合创建?

时间:2017-12-10 08:38:05

标签: asp.net-mvc entity-framework ef-code-first repository-pattern aspnetboilerplate

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

我在NewsDto中定义了名为CreateNewsDtoNewsAppService的2个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表格的推定方法:

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);
}

2 个答案:

答案 0 :(得分:2)

两种选择:

  1. 添加到ICollection并让EF处理实体:
  2. 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代替集合:
    2. 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>类型),则可能需要执行其他步骤。

答案 1 :(得分:0)

谢谢@aaron。毕竟,我有一点问题。在 .WebMpa 项目中如何检索相关图片的新闻。我在模型文件夹中定义NewsViewModel并使用Auto Mapper库将此ViewModel映射到NewsDto。在NewsController中调用NewsAppService和GetAll方法从数据库获取新闻。对于这种情况,我有2个场景: 1-我认为在 .Application 项目中更改此方法并添加一些linq查询以从NewsAttachment获取包含相关图片的新闻 2-所有关于News和NewsAttachment的操作以及与两个实体一起加入 .WebMpa 项目和NewsController。 我真的很困惑。你能帮我展示一下这个例子吗?