UnModified字段没有获得WebAPI

时间:2017-08-04 01:57:10

标签: c# entity-framework asp.net-web-api

我在webapi工作。我有一个更新方法来执行修改。有很多属性,但我只想更新几个字段。

所以我只是使用entry.Property(propertyName)跳过了不需要的字段.IsModified = false;在数据层。我的所有逻辑工作正常,但更新后,当我得到新的更新条目时,它没有没有更新的字段

我的控制器代码:

    [Route("{id:int}")]
    public async Task<IHttpActionResult> Put(int id, MyModel model)
    {
        model.Id = id;
        bool result = await _modelLogic.UpdateData(item);
        if (!result)
        {
            return BadRequest("Could not Save to the database");
        }
        return await GetModel(item.Id);
    }

    [Route("{id:int}", Name = "GetModelById")]
    public async Task<IHttpActionResult> GetModel(int id)
    {
        MyModel model = await _modelLogic.GetModelAsync(id);
        if (Model == null)
        {
            return NotFound();
        }
        return Ok(model);
    }

我的业务逻辑:

    public async Task<bool> UpdateData(MyModel model)
    {
        model.RecordStatus = DataStatus.Active;
        string[] excludedProperties = new[] {"RegistrationId", "StartDate", "ProtocolType", "Code" };
        _repo.Update(model, excludedProperties);
        bool status = await _repo.SaveAsync();
        return status;
    }

这里RegistrationId是外键。

我的数据代码:

    public void Update(MyModel model, string[] excludedProperties)
    {
        excludedPropertiesInUpdate = excludedPropertiesInUpdate.Union(excludedProperties).ToArray();
        base.Update(model);
    }

我的通用存储库/基础存储库

    internal string[] excludedPropertiesInUpdate = new[] { "CreatedDate", "CreatedBy" };
    public void Update(T entity)
    {
        entity.UpdatedDate = DateTime.UtcNow;
        var entry = _context.Entry(entity);
       entry.State = EntityState.Modified;

        //Restrict Modification for Specified Properties
        foreach(string propertyName in excludedPropertiesInUpdate)
        {
            entry.Property(propertyName).IsModified = false;   
        }
    }
像我说的那样,所有的逻辑工作正常。但是当它显示响应时,未更新的字段显示为null。例如:RegistrationId,Code等。但是在数据库中它没有更新任何东西

1 个答案:

答案 0 :(得分:0)

您只能在数据库中存储新值,但不要将未修改的属性加载到实体。

internal string[] excludedPropertiesInUpdate = new[] { "CreatedDate", "CreatedBy" };
public void Update(T entity)
{
    entity.UpdatedDate = DateTime.UtcNow;
    var entry = _context.Entry(entity);
   entry.State = EntityState.Modified;

    //Restrict Modification for Specified Properties
    foreach(string propertyName in excludedPropertiesInUpdate)
    {
        entry.Property(propertyName).IsModified = false;   
    }
    _context.SaveChanges();

    //load actual values from the database.
    entry.Reload(); 
}