C# EF Core-DbContext.Update vs DbContext.Entry(exitingEntity).CurrentValues.SetValues(entity);
根据上的microsoft docs,如果实体未使用自动生成的密钥,则应用程序必须决定是否插入或更新实体:C# EF Core-DbContext.Update vs DbContext.Entry(exitingEntity).CurrentValues.SetValues(entity);,c#,entity-framework,entity-framework-core,dbcontext,ef-core-3.1,C#,Entity Framework,Entity Framework Core,Dbcontext,Ef Core 3.1,根据上的microsoft docs,如果实体未使用自动生成的密钥,则应用程序必须决定是否插入或更新实体: public static void InsertOrUpdate(BloggingContext context, Blog blog) { var existingBlog = context.Blogs.Find(blog.BlogId); if (existingBlog == null) { context.Add(blog); }
public static void InsertOrUpdate(BloggingContext context, Blog blog)
{
var existingBlog = context.Blogs.Find(blog.BlogId);
if (existingBlog == null)
{
context.Add(blog);
}
else
{
context.Entry(existingBlog).CurrentValues.SetValues(blog);
}
context.SaveChanges();
}
假设我在else块中使用它(而不是上面显示的块):
这样做明智吗?
.Update
和.Entry(existingBlog).CurrentValues.SetValues(blog)
有什么不同,特别是在复杂性方面?哪一个打电话成本更低?我似乎找不到关于这两种方法是如何实现的以及它们的复杂性的信息。context.Update
将尝试开始跟踪实体。由于您使用了Find
,DbContext已经在跟踪一个实体,因此使用分离的实体引用调用Update
将导致一个异常,即具有该ID的实体已经被跟踪
如果知道记录两者都存在,并且DbContext没有跟踪它,则可以使用Update
在没有DB负载的情况下满足跟踪检查的替代方案如下:
if (blog.BlogId == 0) // New row, Identity ID set by DB.
context.Blogs.Add(blog);
else
{
var existingBlog = context.Blogs.Local.SingleOrDefault(blog.BlogId);
if (existingBlog == null)
context.Update(blog); // Not tracked, so call Update to update and track
else
context.Entry(existingBlog).CurrentValues.SetValues(blog); // Tracked, so copy across values.
}
context.SaveChanges();
我们只能在这里发表意见。这在很大程度上取决于您自己的偏好和非功能性需求。另见:。
if (blog.BlogId == 0) // New row, Identity ID set by DB.
context.Blogs.Add(blog);
else
{
var existingBlog = context.Blogs.Local.SingleOrDefault(blog.BlogId);
if (existingBlog == null)
context.Update(blog); // Not tracked, so call Update to update and track
else
context.Entry(existingBlog).CurrentValues.SetValues(blog); // Tracked, so copy across values.
}
context.SaveChanges();