Как я могу использовать сопоставленное свойство в установщике свойства NotMapped в C# / Entity Framework - PullRequest
0 голосов
/ 05 января 2020

Я хочу использовать значение свойства с именем DirFotos, которое сопоставлено со столбцом в таблице базы данных, чтобы получить фотографии продукта. На фотографиях товара будет список строк. Этот список не отображается, потому что я получу его из файловой системы. Можно ли использовать сопоставленное свойство в установщике свойства NotMapped в C# / Entity Framework? Кроме того, фотографии возвращают пустой список, когда я выполняю запрос с использованием Entity Framework. Почему NotMapped

class Product

    private List<string> _photos = new List<string>();

    [Column("dir_fotos")]
    public String DirFotos { get; set; }   

    [NotMapped]
    public List<String> photos
    {
        get { return _fotos; }
        set
        {            
            // GetPhotos(this.dirFotos) dirFotos is null here
            _photos.Add("teste1.jpg");
            _photos.Add("teste2.jpg");
        }
    }

Итак, в итоге, у меня есть две проблемы, я не могу использовать this.dirFotos внутри установщика свойства photos (это null) и с этим stati c сниппетом photos возвращает пустой список, когда я получаю продукты с помощью Entity Framework.

1 Ответ

0 голосов
/ 06 января 2020

Из того, что я выясняю из вопроса:

  • У вас есть сущность к таблице, которая содержит путь к каталогу, где можно найти фотографии.
  • Вы хотите иметь список фотографий, которые будут загружены на основе файлов в этом каталоге.
  • Вы обнаружите, что каталог может быть #null при попытке загрузить эти фотографии в несопоставленное свойство.

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

private List<string> _photos = null;
private string _dirPhotos = null;

[Column("dir_fotos")]
public String DirPhotos 
{ 
    get { return _dirPhotos; }
    set
    { 
        if(string.Compare(_dirPhotos, value, true) != 0)
        {
            _dirPhotos = value;   
            _photos = null;
        }
    }
}

[NotMapped]
public List<String> photos
{
    get { return _photos ?? (_photos = GetPhotos(DirPhotos) ); }
}

Здесь важно то, что ваши GetPhotos также начинаются с этого утверждения:

private List<string> GetPhotos(string dirPhotos)
{
    if (string.IsNullOrEmpty(dirPhotos))
        return new List<string>();

    // ... load photos...
}

Ключевые различия здесь:

  • DirPhotos предоставляется переменная и метод получения / установки. Если Каталог изменяется, мы хотим «сбросить» переменную List, чтобы она могла перезагрузиться при следующем обращении.

  • Список инициализируется значением #null в качестве значения по умолчанию. Когда вызывается «getter», он проверит, является ли переменная нулевой, и если так, вызовет ваш метод GetPhotos. Как только эта переменная будет установлена, она будет использовать эти загруженные данные до тех пор, пока не изменится каталог.

  • GetPhotos вернет пустой список, если переданный каталог будет пустым или пустым. Вы также захотите убедиться, что ваш метод GetPhotos утверждает, что любой переданный каталог действителен, и либо выдает исключение, либо возвращает пустой список. Не возвращайте #null, хотя, поскольку мы не хотим встречать исключения с нулевыми ссылками в будущем.

Я считаю, что проблема, с которой вы столкнулись, заключалась в том, что при попытке использовать Setter вы может быть попытка «установить» коллекцию до того, как объект получит возможность загрузить свои данные. С этим шаблоном, когда загрузка происходит на геттере, вы просто загружаете объект как обычно и получаете доступ к DirPhotos после того, как объект был прочитан из DbSet. При первом доступе к DirPhotos будет предпринята попытка загрузить фотографии из файловой системы, но просто убедитесь, что строка объекта может не иметь установленного каталога. (или действительный каталог)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...