Разработка asp. net базового веб-API для добавления подклассов / специализированных объектов - PullRequest
0 голосов
/ 13 июля 2020

Я давно не работал с EF. В качестве упражнения я пишу core web api, который позволяет отслеживать медиа пользователя. Носитель может быть открыткой, фотоальбомом, записью, книгой ...

Я хотел бы знать, как лучше всего использовать метод Add (createMedia):

[HttpPost]
public async Task<ActionResult<bool>> Add(Media media)

Моя модель состоит из нескольких определенных c классов, представляющих один тип носителя - например, открытки, фотоальбомы, записи и т. Д. c. Кроме того, существует тип мультимедиа, который содержит общие свойства для всех типов мультимедиа:

public class Media
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public MediaType Type { get; set; }
    public bool InUse { get; set; }
    public string Date { get; set; } //yyyy-mm-dd
    public string Owner { get; set; }
}

В качестве примера одного из указанных c типов мультимедиа:

public class Postcard
{
    [ForeignKey("Id")]
    public int MediaId { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public string Place { get; set; }
    public string Language { get; set; }

}

Я разработал свой EntityFramework db так, чтобы он состоял из отношения 1-1 между Media и соответствующей спецификацией c media table.

Как лучше всего писать метод Add? Должен ли он получить объект Media и на основе MediaType создать соответствующий тип? Я начал с этого подхода, и действие получило второй параметр с именем detailsJson, который я бы проанализировал и заполнил соответствующий объект с помощью отражения, но выяснил, что привязка POST не будет связывать 2 объекта.

Я не очень разбираюсь в шаблонах проектирования. Должно ли существовать столько же AddBook, AddPostcard ... столько же типов носителей? Я так понимаю, что все модели должны быть POCO objects, без наследования. Я читал про DTOs, но не вижу, чем это мне здесь помогает.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Я полагаю, Открытка и Книга, хотя оба типа носителей имеют разные свойства? например, полей From, To, Place не будет в книге, тогда как в книге могут быть ISBN, Author, Genre и т. д. c.

, так что по сути это разные объекты POCO в целом, тип носителя - это просто общие отношения

В этом случае можно иметь отдельные методы добавления, такие как AddBook, AddPostcard и т. д. c.

Обновление:

Отдельные объекты POCO могут обратитесь к Типу мультимедиа, чтобы избежать дублирования тех же свойств, что и отношение базовых сущностей

public class Postcard
{
    public Media Media { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public string Place { get; set; }
    public string Language { get; set; }

}
0 голосов
/ 14 июля 2020

А как насчет таблицы «ключ-значение»?

public class MediaValue {
    public string MediaId {get;set;}
    public string AttributeName {get;set;}
    public string AttributeValue{get;set;}
    //the key is the couple MediaId - AttributeName
}

public class Media {
   //shared properties
   public MediaType MediaType {get;set;}
   public IEnumerable<MediaValue> Attributes {get;set;}
}

public enum MediaType {
    PostCard, PhotoAlbum, ....
}

тогда вы могли бы добавить DTO для каждого mediatype

public abstract class MediaDTO {
     //shared properties
}

public class PostCardDTO : MediaDTO {
    public string PostCardSpecificAttribute {get;set;} // this.PostCardCustomAttribute = aMediaDbObject.Attributes.FirstOrDefault(x => x.AttributeName == "PostCardSpecificAttribute");
}
...