Я начал экспериментировать с gRPC, и я хотел бы иметь возможность отображать мои сущности БД в сообщениях protobuf, используя automapper. Но я не могу понять, как отобразить повторяющиеся поля.
Мои определения сообщений выглядят так:
message WorklistResponse {
repeated WorklistMessage Worklists = 1;
}
message WorklistMessage {
int32 WorklistId = 1;
repeated CollectionWorkMessage Work = 2;
}
message CollectionWorkMessage {
int32 WorkId = 1;
string AddressComment = 2;
}
И я пытаюсь сопоставить сущность, которая выглядит следующим образом:
[Table("Worklist")]
public sealed class DbWorklist
{
public DbWorklist()
{
Work = new HashSet<DbWork>();
}
[Key]
public int WorklistId { get; set; }
public ICollection<DbWork> Work { get; set; }
}
Где связанные сущности DbWork является абстрактным базовым классом для DbCollectionWork и выглядят так:
[Table("Work")]
public abstract class DbWork
{
[Key]
public int WorkId { get; set; }
public int WorklistId { get; set; }
[ForeignKey(nameof(WorklistId))]
public DbWorklist Worklist { get; set; }
}
public sealed class DbCollectionWork : DbWork
{
[StringLength(255)]
public string AddressComment { get; set; }
}
У меня настроено два сопоставления:
cfg.CreateMap<DbWorklist, WorklistMessage>();
cfg.CreateMap<DbCollectionWork, CollectionWorkMessage>();
Я могу сделать это:
var worklists = dbContext.Worklists.Include(wl => wl.Work).ToList();
var worklistWork = autoMapper.Map<List<CollectionWorkMessage>>(worklists[0].Work);
var worklistResponse = new WorklistResponse
{
Worklists = { new WorklistMessage
{
Work = { worklistWork }
}}
};
Кажется, это единственный способ установить свойство Work, которое является protobuf3 RepeatedField<CollectionWorkMessage>
, которое становится доступным только для чтения в автоматически сгенерированном классе protobuf. * 1019 *
Я бы хотел составить свое сообщение с помощью автоматического преобразователя.
Я использую AutoMapper 8.0, Grpc 1.19.0, Protobuf 3.7.0 и EF Core 2.2.4