簡體   English   中英

如何在 C#/實體框架中的 NotMapped 屬性的 setter 中使用映射屬性

[英]How can I use a mapped property in the setter of a NotMapped property in C# / Entity Framework

我想使用映射到數據庫表中的列的名為DirFotos的屬性的值來檢索產品的照片。 產品的照片將是一個字符串列表。 該列表未映射,因為我將從文件系統中檢索它。 是否可以在 C#/實體框架中的NotMapped屬性的 setter 中使用映射屬性? 當我使用實體框架執行查詢時,除了照片返回一個空列表。 為什么是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");
        }
    }

所以總而言之,我有兩個問題,我不能在照片屬性的 setter 中使用this.dirFotos (它是空的),並且當我使用實體框架檢索產品時,這個靜態片段照片返回一個空列表。

從我從問題中得出的結論:

  • 您有一個表的實體,其中包含用於查找照片的目錄路徑。
  • 您希望有一個將根據該目錄中的文件加載的照片列表。
  • 當您嘗試在非映射屬性中加載這些照片時,您會發現 Directory 可以為 #null。

我懷疑您編寫的基本前提應該可以工作,但是有一些重要的細節。 對於未映射的照片列表,您不需要也不應該使用 setter。 相反,它只需要一個吸氣劑:

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 被賦予一個變量和 getter/setter。 如果目錄更改,我們希望“重置”列表變量,以便下次訪問時可以重新加載。

  • 該列表初始化為#null 作為默認值。 當調用“getter”時,這將檢查變量是否為空,如果是,則調用您的 GetPhotos 方法。 設置該變量后,它將重用加載的數據,直到更改目錄。

  • 如果傳入的 Directory 為空/空,則 GetPhotos 將返回一個空列表。 您還需要確保您的 GetPhotos 方法斷言傳入的任何目錄都是有效的,並且要么冒泡出異常要么返回一個空列表。 不要返回#null,因為我們不想在路上遇到空引用異常。

我相信您遇到的問題是,通過嘗試使用 Setter,您可能會嘗試在實體有機會加載其數據之前“設置”集合。 使用這種加載發生在 getter 上的模式,您只需像平常一樣加載實體,並在從 DbSet 讀取實體后訪問 DirPhotos。 DirPhotos 的第一次訪問將嘗試從文件系統加載照片,但請務必處理實體行可能沒有設置目錄。 (或有效目錄)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM