[英]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.