List.Add()无法在c#中工作 - getter和setter问题?

时间:2015-03-31 14:31:45

标签: c# entity-framework

我有这个属性:

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();

一切都好。图像数组被填满,保存到数据库的效果很好。

如果我将属性更改为:

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;
    }
}

现在做我以前的确切事情,字段。图像仍然是空的但没有错误...当然数据库保存不会发生。

我做错了什么?

修改

这很有效,谢谢......看起来我的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();
        }
    }

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

你的getter 总是返回一个新列表。当你打电话

field.Images.Add(fieldImage);

您正在获取新创建的列表并向其添加项目,但没有与源数据的连接

一些选项:

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