繁体   English   中英

List.Add()在C#中不起作用-吸气剂和吸气剂问题?

[英]List.Add() not working in c# - getter and setter issue?

我有这个属性:

public virtual List<FieldImage> Images { get; set; }

如果我去获取具有此属性的类,则使用这样的实体从数据库中获取...

Field field = this.unitOfWork.FieldRepository.GetByID(Convert.ToInt32(fieldID));

然后将图像添加到数组:

FieldImage fieldImage = new FieldImage()
{
    CreatedAt = dateNow,
    UpdatedAt = dateNow,
    CreatedBy = unitOfWork.UserRepository.GetByID(User.Identity.GetUserId()),
    File = file,
    Field = field
};

field.Images.Add(fieldImage);

然后像这样保存上下文:

this.context.SaveChanges();

一切都还好。 images数组被填满,并且保存到数据库的效果很好。

如果我将属性更改为此:

private List<FieldImage> _images;
public virtual List<FieldImage> Images
{
    get
    {
        return 
            this._images != null ? 
            this._images.Where(x => x.DeletedAt == null).ToList() : 
            new List<FieldImage>();
    }
    set
    {
        this._images = value;
    }
}

现在执行我之前熟悉的确切操作,即field.Images仍然为空,但不会发生任何错误...并且当然不会发生数据库保存。

我究竟做错了什么?

编辑:

这行得通,谢谢...看来我的if逻辑有问题:

    private List<FieldImage> _images;
    public virtual List<FieldImage> Images
    {
        get
        {
            if (this._images == null)
            {
                this._images = new List<FieldImage>();
            }

            return this._images;
        }
        set
        {
            this._images = value.Where( x => x.DeletedAt == null ).ToList();
        }
    }

为什么要在模型上执行这种操作? 您可以添加另一个标记为“ NotMapped”的列以执行相同的操作,请阅读以下代码:

[NotMapped]
public IEnumerable<FieldImage> NotDeletedImages 
{
    get 
    {
        return this.Images.Where(x => !x.Deleted);
    }
}

我想您应用此过滤器是因为您要“显示”不同的数据。 在这种情况下,为什么不使用视图模型?

您的获取者总是返回一个新列表 你打电话时

field.Images.Add(fieldImage);

您将获得一个新创建的列表并向其中添加一个项目,但是与源数据没有任何关系

一些选项:

  • 添加将项目添加到原始列表的Add方法
  • 在加载数据而不是获取数据时过滤项目
  • 询问属性时,将字段值( _images )设置为已过滤列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM