如何更新Entity Framework Core中的单个属性

时间:2018-06-10 01:47:06

标签: entity-framework-core

我只需要更新实体的一个或两个属性。换句话说,我有一个具有Id,ParentId,Name和Description的实体。

问题是,当名称更新时,如果数据库中已存在描述,则该描述将被删除。

这是代码:

internal void Update(ItemInfo itemInfo)
    {
        var item = new Item { Id = itemInfo.Id, ParentId = itemInfo.ParentId, Name = itemInfo.Name };
        var entry = this.DbContext.Items.Attach(item);
        if(item.ParentId!=null) entry.Property(x => x.ParentId).IsModified = true;
        if(!(String.IsNullOrWhiteSpace(item.Name))) entry.Property(x => x.Name).IsModified = true;
        this.SaveChanges();;
    }

我认为,因为我将特定属性设置为已修改,所以只会更新该属性。

或者我应该首先从数据库中获取实体,然后只是设置属性并保存。我想避免两次访问数据库进行单次保存。

2 个答案:

答案 0 :(得分:1)

您必须先从数据库中获取实体,然后更新实体。

答案 1 :(得分:0)

您可以执行以下操作以更新单个属性:

String strNumber = ag.getText().toString().trim();

if(TextUtils.isEmpty(strNumber)){
                 Toast.makeText(Addrecord.this,"Please input a number",Toast.LENGTH_LONG).show();
                }else{
 String regexStr = "^[0-9]*$";

if(your_editText.getText().toString().trim().matches(regexStr))
{
    //write code here for success
    your_editText.setError(null) // to clear any errors
}
else{
    your_editText.setError(“please insert numbers only”);
}
    }
 }

但是,如果您仅更新一些属性,那么我认为您不应该将整个对象作为参数发送,而只需发送需要更新的属性,如下所示:

internal void Update(ItemInfo itemInfo)
{
    if (itemInfo == null) { throw new Exception($"item info was not supplied"); }

    var itemInfoEntity = new ItemInfo()
    {
        Id          = itemInfo.Id,
        ParentId    = itemInfo.ParentId,
        Name        = itemInfo.Name 
    };

    dbContext.ItemInfo.Attach(itemInfoEntity);
    dbContext.Entry(itemInfoEntity).Property(x => x.Id).IsModified = true;
    dbContext.Entry(itemInfoEntity).Property(x => x.Id).IsModified = true;
    dbContext.Entry(itemInfoEntity).Property(x => x.Id).IsModified = true;
    dbContext.SaveChanges();
}