代码之家  ›  专栏  ›  技术社区  ›  M.Sabzi

如何在应用层实现随子集合创建?

  •  0
  • M.Sabzi  · 技术社区  · 7 年前

    我有两个实体 News NewsAttachment .果心 项目这些实体通过 News_Id . 换句话说,当我创建新的 消息 并将其添加到数据库中 消息 可能有一个或两个附件介质,我想将其插入名为 新闻附件 . 所以我可能想找回 新闻Id 并在相关表格中插入附件。

    我定义了2个名为 NewsDto CreateNewsDto 在里面 NewsAppService 我通过了 CreateNewsDto 插入新的 消息 ,但我不知道该怎么做 新闻附件 .

    这是我的 消息 实体:

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

    新闻附件 实体:

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

    以下是我在 新闻应用服务 插入新的 消息 并将相关媒体添加到 新闻附件 表格:

    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 回复  |  直到 7 年前
        1
  •  2
  •   aaron    7 年前

    有两种选择:

    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> 类型)。

        2
  •  0
  •   M.Sabzi    7 年前

    谢谢你,亚伦。毕竟,我有一个小问题。在里面 .WebMpa 项目如何检索相关图片的新闻。我在model文件夹中定义NewsViewModel,并使用自动映射器库将此ViewModel映射到NewsDto。在NewsController中,调用NewsAppService和GetAll方法从数据库中获取新闻。对于这种情况,我有两种情况: 1-我认为在 .应用 项目并添加一些linq查询,以从NewsAttachment获取包含相关图片的新闻 2-所有关于新闻和新闻附件的操作以及与两个实体的连接停留在 .WebMpa 项目和新闻控制器。 我真的很困惑。你能帮我举个例子吗?