Универсальные типы Entity Framework

Скажем, у меня есть эти классы:

public class Message 
{
    public int MessageId { get; set; }
    public string Text { get; set; }
    public DateTime CreateDate { get; set; }
    public virtual ICollection<Media> Media{ get; set; }
}

public class Image
{
    public int ImageId { get; set; }
}

public class Video
{
    public int VideoId { get; set; }
}

Я хочу, чтобы коллекция Mediaв Messageклассе могла содержать видео и изображения. Как бы я это сделал?

Я подозреваю, что мне нужно создать список для каждого типа носителей, которые могут быть использованы. Я надеюсь, что существует более чистое решение.

1 ответ

  1. Если вы думаете о универсальной реализации, то рассмотрите интерфейс IMedia с базовым классом мультимедиа.

    Например:

    public interface IMedia
    {
        public readonly IEnumerable<MediaResource> MediaResources {get; set;}
    }
    
    public interface IMediaResource<T> where T: class
    {
        public Type MediaId;
        public void SetMedia<T>(int mediaId);
    }
    
    public class MediaResource<T> : IMediaResource<T> //Container for a media resource
    {
        public Type mediaType { get; private set;}
        public int mediaId {get; private set;}
    
        public void SetMedia<T>(int mediaId)
        {
            this.mediaType = typeof(T);
            this.mediaId = mediaId;
        }
    }
    
    public class Media : IMedia
    {
        public readonly IEnumerable<MediaResource> MediaResources {get; set;}
    }
    

    T-универсальный тип. Вы можете использовать класс, как изображение, растровое изображение и т.д. Или что-нибудь еще на самом деле. Это может содержать что угодно. Вы можете добавить ограничение на T, чтобы его не просто класс, но производный от базового типа носителя.