如何在Application Layer实现Create with child collection?
How to implement Create with child collection in Application Layer?
我在 .Core 项目中有 2 个名为 News
和 NewsAttachment
的实体。这些实体通过 News_Id
建立了关系。换句话说,当我创建新的 News
并将其添加到数据库中时,这个 News
可能有一个或两个我想插入到名为 [=16= 的相关 table 中的附件媒体].所以我可能想检索 News_Id
并在相关的 table.
中插入附件
我在 NewsAppService
中定义了两个名为 NewsDto
和 CreateNewsDto
的 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);
}
两个选择:
- 添加到
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);
}
- 通过
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 你能帮我举个例子吗?
我在 .Core 项目中有 2 个名为 News
和 NewsAttachment
的实体。这些实体通过 News_Id
建立了关系。换句话说,当我创建新的 News
并将其添加到数据库中时,这个 News
可能有一个或两个我想插入到名为 [=16= 的相关 table 中的附件媒体].所以我可能想检索 News_Id
并在相关的 table.
我在 NewsAppService
中定义了两个名为 NewsDto
和 CreateNewsDto
的 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);
}
两个选择:
- 添加到
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);
}
- 通过
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 你能帮我举个例子吗?