1、先查询在更新数据
可以先通过条件查询到实体,然后修改实体数据,最后调用SaveChanges()
方法进行保存到数据库中。如果不通过查询直接更新没有跟踪的实体,可以调用Update(entity)
方法。但要注意Update()
方法会把实体所有字段标记成已修改,所以使用时应该考虑一下是不是要修改所有字段。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class Product
{
public int? ProductID { get; set; }
public string ProductName { get; set; }
public string Description { get; set; }
public decimal? UnitPrice { get; set; }
}
public class StoreDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Your Connection String");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>(entity =>
{
// Set key for entity
entity.HasKey(p => p.ProductID);
});
base.OnModelCreating(modelBuilder);
}
}
class Program
{
static void Main(string[] args)
{
using (var context = new StoreDbContext())
{
// 通过ProductID查询需要修改的数据
var entity = context.Products.FirstOrDefault(item => item.ProductID == id);
// Validate entity is not null
if (entity != null)
{
entity.UnitPrice = 22.39m;
entity.Description = "cjavapy.com";
/*如果model被跟踪,那么不需要调用更新API。
只有在没有跟踪条目的情况下才需要调用API。
*/
//context.Products.Update(entity);
// 保存更改到数据库
context.SaveChanges();
}
}
}
}
}
2、使用Attach()和Entry()更新
在DbContext
上使用Update()
方法会将所有字段标记为已修改,并将所有字段都包含在查询中。如果要更新某几个字段,不是全部字段,则应使用Attach()
方法,然后将所需的字段标记为手动修改。
例如,
using (var context = new StoreDbContext())
{
context.Attach(person);
context.Entry(person).Property(p => p.Name).IsModified = true;
context.SaveChanges();
}