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

Gre*_*Gum 2 c# 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();;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Moh*_*mad 10

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

internal void Update(id, parentId, name)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)