[英]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
(它是空的),並且當我使用實體框架檢索產品時,這個靜態片段照片返回一個空列表。
從我從問題中得出的結論:
我懷疑您編寫的基本前提應該可以工作,但是有一些重要的細節。 對於未映射的照片列表,您不需要也不應該使用 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.