Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core-DbContext.Update vs DbContext.Entry(exitingEntity).CurrentValues.SetValues(entity);_C#_Entity Framework_Entity Framework Core_Dbcontext_Ef Core 3.1 - Fatal编程技术网

C# EF Core-DbContext.Update vs DbContext.Entry(exitingEntity).CurrentValues.SetValues(entity);

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); }

根据上的microsoft docs,如果实体未使用自动生成的密钥,则应用程序必须决定是否插入或更新实体:

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();