C# 如何更新实体框架核心中的单个属性

C# 如何更新实体框架核心中的单个属性,c#,entity-framework-core,C#,Entity Framework Core,我只需要更新一个实体的一个或两个属性。换句话说,我有一个具有Id、ParentId、名称和描述的实体 问题是,当名称更新时,如果描述已经存在于数据库中,那么它将被删除 代码如下: 内部无效更新(ItemInfo ItemInfo) { var item=newitem{Id=itemInfo.Id,ParentId=itemInfo.ParentId,Name=itemInfo.Name}; var entry=this.DbContext.Items.Attach(item); if(item

我只需要更新一个实体的一个或两个属性。换句话说,我有一个具有Id、ParentId、名称和描述的实体

问题是,当名称更新时,如果描述已经存在于数据库中,那么它将被删除

代码如下:

内部无效更新(ItemInfo ItemInfo)
{
var item=newitem{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;
这个.SaveChanges();;
}
我认为,由于我正在将特定属性设置为“已修改”,因此只会更新该属性


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

您必须首先使用“从数据库”获取实体,然后更新实体。

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

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();
}
但如果只更新少数属性,那么我认为不应该将整个对象作为参数发送,只发送需要更新的属性,如下所示:

internal void Update(id, parentId, name)
{
 ...
}

你的想法是正确的。生成的SQL是什么?首先从DB获取,然后update@CodeNotFound,我不确定生成的SQL。我该如何观察呢?@viveknuna,好的,我这么做了,是的,它工作得很好。@Greg0很好,然后我开始尝试上面的方法,但发现它删除了该实体数据库中已经存在的其他数据。这不可能,此外,我在使用这种方法时没有删除现有数据。不知道这是如何被接受为答案的。下面的帖子更具信息性,最有可能是因为它是第一个被回复的帖子