繁体   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