diff --git a/entity-framework/core/extensions/index.md b/entity-framework/core/extensions/index.md index 77b9ae422a..988d4869da 100644 --- a/entity-framework/core/extensions/index.md +++ b/entity-framework/core/extensions/index.md @@ -35,7 +35,7 @@ An ORM that creates strongly-typed, extendable classes for Entity Framework. The ### EF Core Power Tools -EF Core Power Tools is a Visual Studio extension that exposes various EF Core design-time tasks in a simple user interface. It includes reverse engineering of DbContext and entity classes from existing databases and [SQL Server DACPACs](https://docs.microsoft.com/sql/relational-databases/data-tier-applications/data-tier-applications), management of database migrations, and model visualizations. For EF Core: 2, 3. +EF Core Power Tools is a Visual Studio extension that exposes various EF Core design-time tasks in a simple user interface. It includes reverse engineering of DbContext and entity classes from existing databases and [SQL Server DACPACs](/sql/relational-databases/data-tier-applications/data-tier-applications), management of database migrations, and model visualizations. For EF Core: 2, 3. [GitHub wiki](https://github.com/ErikEJ/EFCorePowerTools/wiki) diff --git a/entity-framework/core/managing-schemas/scaffolding.md b/entity-framework/core/managing-schemas/scaffolding.md index 639726ec3a..5138467c73 100644 --- a/entity-framework/core/managing-schemas/scaffolding.md +++ b/entity-framework/core/managing-schemas/scaffolding.md @@ -40,7 +40,7 @@ Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' If you have an ASP.NET Core project, you can use the `Name=` syntax to read the connection string from configuration. -This works well with the [Secret Manager tool](https://docs.microsoft.com/aspnet/core/security/app-secrets#secret-manager) to keep your database password separate from your codebase. +This works well with the [Secret Manager tool](/aspnet/core/security/app-secrets#secret-manager) to keep your database password separate from your codebase. ```dotnetcli dotnet user-secrets set ConnectionStrings.Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" diff --git a/entity-framework/core/miscellaneous/cli/index.md b/entity-framework/core/miscellaneous/cli/index.md index 75633cae9d..0e942908f7 100644 --- a/entity-framework/core/miscellaneous/cli/index.md +++ b/entity-framework/core/miscellaneous/cli/index.md @@ -12,9 +12,9 @@ The Entity Framework Core tools help with design-time development tasks. They're `DbContext` and entity types by reverse engineering the schema of a database. * The [EF Core Package Manager Console tools](powershell.md) run in -the [Package Manager Console](https://docs.microsoft.com/nuget/tools/package-manager-console) in Visual Studio. +the [Package Manager Console](/nuget/tools/package-manager-console) in Visual Studio. -* The [EF Core .NET command-line interface (CLI) tools](dotnet.md) are an extension to the cross-platform [.NET Core CLI tools](https://docs.microsoft.com/dotnet/core/tools/). These tools require a .NET Core SDK project (one with `Sdk="Microsoft.NET.Sdk"` or similar in the project file). +* The [EF Core .NET command-line interface (CLI) tools](dotnet.md) are an extension to the cross-platform [.NET Core CLI tools](/dotnet/core/tools/). These tools require a .NET Core SDK project (one with `Sdk="Microsoft.NET.Sdk"` or similar in the project file). Both tools expose the same functionality. If you're developing in Visual Studio, we recommend using the **Package Manager Console** tools since they provide a more integrated experience. diff --git a/entity-framework/core/miscellaneous/collations-and-case-sensitivity.md b/entity-framework/core/miscellaneous/collations-and-case-sensitivity.md index 7930a17d97..97ada406db 100644 --- a/entity-framework/core/miscellaneous/collations-and-case-sensitivity.md +++ b/entity-framework/core/miscellaneous/collations-and-case-sensitivity.md @@ -62,11 +62,11 @@ Note that some databases allow the collation to be defined when creating an inde In .NET, string equality is case-sensitive by default: `s1 == s2` performs an ordinal comparison that requires the strings to be identical. Because the default collation of databases varies, and because it is desirable for simple equality to use indexes, EF Core makes no attempt to translate simple equality to a database case-sensitive operation: C# equality is translated directly to SQL equality, which may or may not be case-sensitive, depending on the specific database in use and its collation configuration. -In addition, .NET provides overloads of [`string.Equals`](https://docs.microsoft.com/dotnet/api/system.string.equals#System_String_Equals_System_String_System_StringComparison_) accepting a [`StringComparison`](https://docs.microsoft.com/dotnet/api/system.stringcomparison) enum, which allows specifying case-sensitivity and culture for the comparison. By design, EF Core refrains from translating these overloads to SQL, and attempting to use them will result in an exception. For one thing, EF Core does know not which case-sensitive or case-insensitive collation should be used. More importantly, applying a collation would in most cases prevent index usage, significantly impacting performance for a very basic and commonly-used .NET construct. To force a query to use case-sensitive or case-insensitive comparison, specify a collation explicitly via `EF.Functions.Collate` as [detailed above](#explicit-collations-and-indexes). +In addition, .NET provides overloads of [`string.Equals`](/dotnet/api/system.string.equals#System_String_Equals_System_String_System_StringComparison_) accepting a [`StringComparison`](/dotnet/api/system.stringcomparison) enum, which allows specifying case-sensitivity and culture for the comparison. By design, EF Core refrains from translating these overloads to SQL, and attempting to use them will result in an exception. For one thing, EF Core does know not which case-sensitive or case-insensitive collation should be used. More importantly, applying a collation would in most cases prevent index usage, significantly impacting performance for a very basic and commonly-used .NET construct. To force a query to use case-sensitive or case-insensitive comparison, specify a collation explicitly via `EF.Functions.Collate` as [detailed above](#explicit-collations-and-indexes). ## Database-specific information -* [SQL Server documentation on collations](https://docs.microsoft.com/sql/relational-databases/collations/collation-and-unicode-support). -* [Microsoft.Data.Sqlite documentation on collations](https://docs.microsoft.com/dotnet/standard/data/sqlite/collation). +* [SQL Server documentation on collations](/sql/relational-databases/collations/collation-and-unicode-support). +* [Microsoft.Data.Sqlite documentation on collations](/dotnet/standard/data/sqlite/collation). * [PostgreSQL documentation on collations](https://www.postgresql.org/docs/current/collation.html). * [MySQL documentation on collations](https://dev.mysql.com/doc/refman/en/charset-general.html). diff --git a/entity-framework/core/miscellaneous/configuring-dbcontext.md b/entity-framework/core/miscellaneous/configuring-dbcontext.md index 72a4051ceb..001dfaa077 100644 --- a/entity-framework/core/miscellaneous/configuring-dbcontext.md +++ b/entity-framework/core/miscellaneous/configuring-dbcontext.md @@ -178,7 +178,7 @@ Always await EF Core asynchronous methods immediately. ### Implicitly sharing DbContext instances across multiple threads via dependency injection -The [`AddDbContext`](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.entityframeworkservicecollectionextensions.adddbcontext) extension method registers `DbContext` types with a [scoped lifetime](https://docs.microsoft.com/aspnet/core/fundamentals/dependency-injection#service-lifetimes) by default. +The [`AddDbContext`](/dotnet/api/microsoft.extensions.dependencyinjection.entityframeworkservicecollectionextensions.adddbcontext) extension method registers `DbContext` types with a [scoped lifetime](/aspnet/core/fundamentals/dependency-injection#service-lifetimes) by default. This is safe from concurrent access issues in most ASP.NET Core applications because there is only one thread executing each client request at a given time, and because each request gets a separate dependency injection scope (and therefore a separate `DbContext` instance). For Blazor Server hosting model, one logical request is used for maintaining the Blazor user circuit, and thus only one scoped DbContext instance is available per user circuit if the default injection scope is used. @@ -188,5 +188,5 @@ Using dependency injection, this can be achieved by either registering the conte ## More reading -- Read [Dependency Injection](https://docs.microsoft.com/aspnet/core/fundamentals/dependency-injection) to learn more about using DI. +- Read [Dependency Injection](/aspnet/core/fundamentals/dependency-injection) to learn more about using DI. - Read [Testing](testing/index.md) for more information. diff --git a/entity-framework/core/miscellaneous/logging.md b/entity-framework/core/miscellaneous/logging.md index 825c6118a1..9910393c56 100644 --- a/entity-framework/core/miscellaneous/logging.md +++ b/entity-framework/core/miscellaneous/logging.md @@ -12,7 +12,7 @@ uid: core/miscellaneous/logging ## ASP.NET Core applications -EF Core integrates automatically with the logging mechanisms of ASP.NET Core whenever `AddDbContext` or `AddDbContextPool` is used. Therefore, when using ASP.NET Core, logging should be configured as described in the [ASP.NET Core documentation](https://docs.microsoft.com/aspnet/core/fundamentals/logging?tabs=aspnetcore2x). +EF Core integrates automatically with the logging mechanisms of ASP.NET Core whenever `AddDbContext` or `AddDbContextPool` is used. Therefore, when using ASP.NET Core, logging should be configured as described in the [ASP.NET Core documentation](/aspnet/core/fundamentals/logging?tabs=aspnetcore2x). ## Other applications @@ -82,4 +82,4 @@ In this example, the log is filtered to only return messages: For EF Core, logger categories are defined in the `DbLoggerCategory` class to make it easy to find categories, but these resolve to simple strings. -More details on the underlying logging infrastructure can be found in the [ASP.NET Core logging documentation](https://docs.microsoft.com/aspnet/core/fundamentals/logging?tabs=aspnetcore2x). +More details on the underlying logging infrastructure can be found in the [ASP.NET Core logging documentation](/aspnet/core/fundamentals/logging?tabs=aspnetcore2x). diff --git a/entity-framework/core/miscellaneous/rc2-rtm-upgrade.md b/entity-framework/core/miscellaneous/rc2-rtm-upgrade.md index ac504d8305..4030854765 100644 --- a/entity-framework/core/miscellaneous/rc2-rtm-upgrade.md +++ b/entity-framework/core/miscellaneous/rc2-rtm-upgrade.md @@ -59,7 +59,7 @@ If you were targeting .NET Core with RC2, you needed to add `imports` to project ``` > [!NOTE] -> As of version 1.0 RTM, the [.NET Core SDK](https://www.microsoft.com/net/download/core) no longer supports `project.json` or developing .NET Core applications using Visual Studio 2015. We recommend you [migrate from project.json to csproj](https://docs.microsoft.com/dotnet/articles/core/migration/). If you are using Visual Studio, we recommend you upgrade to [Visual Studio 2017](https://www.visualstudio.com/downloads/). +> As of version 1.0 RTM, the [.NET Core SDK](https://www.microsoft.com/net/download/core) no longer supports `project.json` or developing .NET Core applications using Visual Studio 2015. We recommend you [migrate from project.json to csproj](/dotnet/articles/core/migration/). If you are using Visual Studio, we recommend you upgrade to [Visual Studio 2017](https://www.visualstudio.com/downloads/). ## UWP: Add binding redirects diff --git a/entity-framework/core/modeling/backing-field.md b/entity-framework/core/modeling/backing-field.md index 1e4990d6fc..533a2fd30e 100644 --- a/entity-framework/core/modeling/backing-field.md +++ b/entity-framework/core/modeling/backing-field.md @@ -40,7 +40,7 @@ By default, EF will always read and write to the backing field - assuming one ha [!code-csharp[Main](../../../samples/core/Modeling/FluentAPI/BackingFieldAccessMode.cs?name=BackingFieldAccessMode&highlight=6)] -See the [PropertyAccessMode enum](https://docs.microsoft.com/dotnet/api/microsoft.entityframeworkcore.propertyaccessmode) for the complete set of supported options. +See the [PropertyAccessMode enum](/dotnet/api/microsoft.entityframeworkcore.propertyaccessmode) for the complete set of supported options. > [!NOTE] > With EF Core 3.0, the default property access mode changed from `PreferFieldDuringConstruction` to `PreferField`. diff --git a/entity-framework/core/modeling/indexes.md b/entity-framework/core/modeling/indexes.md index 38780c4d70..8f74a2734a 100644 --- a/entity-framework/core/modeling/indexes.md +++ b/entity-framework/core/modeling/indexes.md @@ -40,7 +40,7 @@ You can use the Fluent API to set the name of the index created in the database: ## Index filter -Some relational databases allow you to specify a filtered or partial index. This allows you to index only a subset of a column's values, reducing the index's size and improving both performance and disk space usage. For more information on SQL Server filtered indexes, [see the documentation](https://docs.microsoft.com/sql/relational-databases/indexes/create-filtered-indexes). +Some relational databases allow you to specify a filtered or partial index. This allows you to index only a subset of a column's values, reducing the index's size and improving both performance and disk space usage. For more information on SQL Server filtered indexes, [see the documentation](/sql/relational-databases/indexes/create-filtered-indexes). You can use the Fluent API to specify a filter on an index, provided as a SQL expression: @@ -52,7 +52,7 @@ When using the SQL Server provider EF adds an `'IS NOT NULL'` filter for all nul ## Included columns -Some relational databases allow you to configure a set of columns which get included in the index, but aren't part of its "key". This can significantly improve query performance when all columns in the query are included in the index either as key or nonkey columns, as the table itself doesn't need to be accessed. For more information on SQL Server included columns, [see the documentation](https://docs.microsoft.com/sql/relational-databases/indexes/create-indexes-with-included-columns). +Some relational databases allow you to configure a set of columns which get included in the index, but aren't part of its "key". This can significantly improve query performance when all columns in the query are included in the index either as key or nonkey columns, as the table itself doesn't need to be accessed. For more information on SQL Server included columns, [see the documentation](/sql/relational-databases/indexes/create-indexes-with-included-columns). In the following example, the `Url` column is part of the index key, so any query filtering on that column can use the index. But in addition, queries accessing only the `Title` and `PublishedOn` columns will not need to access the table and will run more efficiently: diff --git a/entity-framework/core/modeling/spatial.md b/entity-framework/core/modeling/spatial.md index 3090d990d6..bfe87566f6 100644 --- a/entity-framework/core/modeling/spatial.md +++ b/entity-framework/core/modeling/spatial.md @@ -339,7 +339,7 @@ Polygon.NumInteriorRings | ✔ | ✔ | ✔ | ✔ ## Additional resources -* [Spatial Data in SQL Server](https://docs.microsoft.com/sql/relational-databases/spatial/spatial-data-sql-server) +* [Spatial Data in SQL Server](/sql/relational-databases/spatial/spatial-data-sql-server) * [SpatiaLite Homepage](https://www.gaia-gis.it/fossil/libspatialite) * [Npgsql Spatial Documentation](https://www.npgsql.org/efcore/mapping/nts.html) * [PostGIS Documentation](https://postgis.net/documentation/) diff --git a/entity-framework/core/querying/filters.md b/entity-framework/core/querying/filters.md index faefaf895d..0975929429 100644 --- a/entity-framework/core/querying/filters.md +++ b/entity-framework/core/querying/filters.md @@ -37,7 +37,7 @@ The predicate expressions passed to the _HasQueryFilter_ calls will now automati > Note the use of a DbContext instance level field: `_tenantId` used to set the current tenant. Model-level filters will use the value from the correct context instance (that is, the instance that is executing the query). > [!NOTE] -> It is currently not possible to define multiple query filters on the same entity - only the last one will be applied. However, you can define a single filter with multiple conditions using the logical _AND_ operator ([`&&` in C#](https://docs.microsoft.com/dotnet/csharp/language-reference/operators/boolean-logical-operators#conditional-logical-and-operator-)). +> It is currently not possible to define multiple query filters on the same entity - only the last one will be applied. However, you can define a single filter with multiple conditions using the logical _AND_ operator ([`&&` in C#](/dotnet/csharp/language-reference/operators/boolean-logical-operators#conditional-logical-and-operator-)). ## Use of navigations diff --git a/entity-framework/core/saving/async.md b/entity-framework/core/saving/async.md index 7adb16bc2e..1e3f0c7d58 100644 --- a/entity-framework/core/saving/async.md +++ b/entity-framework/core/saving/async.md @@ -8,7 +8,7 @@ uid: core/saving/async # Asynchronous Saving -Asynchronous saving avoids blocking a thread while the changes are written to the database. This can be useful to avoid freezing the UI of a thick-client application. Asynchronous operations can also increase throughput in a web application, where the thread can be freed up to service other requests while the database operation completes. For more information, see [Asynchronous Programming in C#](https://docs.microsoft.com/dotnet/csharp/async). +Asynchronous saving avoids blocking a thread while the changes are written to the database. This can be useful to avoid freezing the UI of a thick-client application. Asynchronous operations can also increase throughput in a web application, where the thread can be freed up to service other requests while the database operation completes. For more information, see [Asynchronous Programming in C#](/dotnet/csharp/async). > [!WARNING] > EF Core does not support multiple parallel operations being run on the same context instance. You should always wait for an operation to complete before beginning the next operation. This is typically done by using the `await` keyword on each asynchronous operation. diff --git a/entity-framework/core/what-is-new/ef-core-3.0/breaking-changes.md b/entity-framework/core/what-is-new/ef-core-3.0/breaking-changes.md index d0abfbc61a..79de2f8754 100644 --- a/entity-framework/core/what-is-new/ef-core-3.0/breaking-changes.md +++ b/entity-framework/core/what-is-new/ef-core-3.0/breaking-changes.md @@ -965,7 +965,7 @@ modelBuilder **Old behavior** -Before EF Core 3.0, calling `AddDbContext` or `AddDbContextPool` would also register logging and memory caching services with DI through calls to [AddLogging](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.loggingservicecollectionextensions.addlogging) and [AddMemoryCache](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). +Before EF Core 3.0, calling `AddDbContext` or `AddDbContextPool` would also register logging and memory caching services with DI through calls to [AddLogging](/dotnet/api/microsoft.extensions.dependencyinjection.loggingservicecollectionextensions.addlogging) and [AddMemoryCache](/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). **New behavior** @@ -977,7 +977,7 @@ EF Core 3.0 does not require that these services are in the application's DI con **Mitigations** -If your application needs these services, then register them explicitly with the DI container using [AddLogging](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.loggingservicecollectionextensions.addlogging) or [AddMemoryCache](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). +If your application needs these services, then register them explicitly with the DI container using [AddLogging](/dotnet/api/microsoft.extensions.dependencyinjection.loggingservicecollectionextensions.addlogging) or [AddMemoryCache](/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). ### AddEntityFramework* adds IMemoryCache with a size limit @@ -999,7 +999,7 @@ Using IMemoryCache without a limit could result in uncontrolled memory usage if In most cases calling `AddEntityFramework*` is not necessary if `AddDbContext` or `AddDbContextPool` is called as well. Therefore, the best mitigation is to remove the `AddEntityFramework*` call. -If your application needs these services, then register a IMemoryCache implementation explicitly with the DI container beforehand using [AddMemoryCache](https://docs.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). +If your application needs these services, then register a IMemoryCache implementation explicitly with the DI container beforehand using [AddMemoryCache](/dotnet/api/microsoft.extensions.dependencyinjection.memorycacheservicecollectionextensions.addmemorycache). diff --git a/entity-framework/core/what-is-new/ef-core-3.0/index.md b/entity-framework/core/what-is-new/ef-core-3.0/index.md index 951b5d60e8..d4baebde0f 100644 --- a/entity-framework/core/what-is-new/ef-core-3.0/index.md +++ b/entity-framework/core/what-is-new/ef-core-3.0/index.md @@ -64,7 +64,7 @@ See the [Cosmos DB provider documentation](xref:core/providers/cosmos/index) for ## C# 8.0 support -EF Core 3.0 takes advantage of a couple of the [new features in C# 8.0](https://docs.microsoft.com/dotnet/csharp/whats-new/csharp-8): +EF Core 3.0 takes advantage of a couple of the [new features in C# 8.0](/dotnet/csharp/whats-new/csharp-8): ### Asynchronous streams @@ -82,7 +82,7 @@ await foreach(var o in orders.AsAsyncEnumerable()) } ``` -See the [asynchronous streams in the C# documentation](https://docs.microsoft.com/dotnet/csharp/whats-new/csharp-8#asynchronous-streams) for more details. +See the [asynchronous streams in the C# documentation](/dotnet/csharp/whats-new/csharp-8#asynchronous-streams) for more details. ### Nullable reference types diff --git a/entity-framework/core/what-is-new/ef-core-5.0/plan.md b/entity-framework/core/what-is-new/ef-core-5.0/plan.md index bbe4ac45fb..7242d75fd2 100644 --- a/entity-framework/core/what-is-new/ef-core-5.0/plan.md +++ b/entity-framework/core/what-is-new/ef-core-5.0/plan.md @@ -229,7 +229,7 @@ Tracked by [#1675](https://github.com/dotnet/EntityFramework.Docs/issues/1675) T-shirt size: M -Status: Completed. The new documentation is [live on the Microsoft docs site](https://docs.microsoft.com/dotnet/standard/data/sqlite/?tabs=netcore-cli). +Status: Completed. The new documentation is [live on the Microsoft docs site](/dotnet/standard/data/sqlite/?tabs=netcore-cli). The EF Team also owns the Microsoft.Data.Sqlite ADO.NET provider. We plan to fully document this provider as part of the 5.0 release. diff --git a/entity-framework/core/what-is-new/ef-core-5.0/whatsnew.md b/entity-framework/core/what-is-new/ef-core-5.0/whatsnew.md index 2f39998ee6..e6f89123fd 100644 --- a/entity-framework/core/what-is-new/ef-core-5.0/whatsnew.md +++ b/entity-framework/core/what-is-new/ef-core-5.0/whatsnew.md @@ -502,7 +502,7 @@ Documentation is tracked by issue [#2273](https://github.com/dotnet/EntityFramew ### Flow arguments into IDesignTimeDbContextFactory -Arguments are now flowed from the command line into the `CreateDbContext` method of [IDesignTimeDbContextFactory](https://docs.microsoft.com/dotnet/api/microsoft.entityframeworkcore.design.idesigntimedbcontextfactory-1?view=efcore-3.1). For example, to indicate this is a dev build, a custom argument (e.g. `dev`) can be passed on the command line: +Arguments are now flowed from the command line into the `CreateDbContext` method of [IDesignTimeDbContextFactory](/dotnet/api/microsoft.entityframeworkcore.design.idesigntimedbcontextfactory-1?view=efcore-3.1). For example, to indicate this is a dev build, a custom argument (e.g. `dev`) can be passed on the command line: ``` dotnet ef migrations add two --verbose --dev @@ -773,7 +773,7 @@ Documentation is tracked by issue [#2075](https://github.com/dotnet/EntityFramew ### Change-tracking proxies -EF Core can now generate runtime proxies that automatically implement [INotifyPropertyChanging](https://docs.microsoft.com/dotnet/api/system.componentmodel.inotifypropertychanging?view=netcore-3.1) and [INotifyPropertyChanged](https://docs.microsoft.com/dotnet/api/system.componentmodel.inotifypropertychanged?view=netcore-3.1). These then report value changes on entity properties directly to EF Core, avoiding the need to scan for changes. However, proxies come with their own set of limitations, so they are not for everyone. +EF Core can now generate runtime proxies that automatically implement [INotifyPropertyChanging](/dotnet/api/system.componentmodel.inotifypropertychanging?view=netcore-3.1) and [INotifyPropertyChanged](/dotnet/api/system.componentmodel.inotifypropertychanged?view=netcore-3.1). These then report value changes on entity properties directly to EF Core, avoiding the need to scan for changes. However, proxies come with their own set of limitations, so they are not for everyone. Documentation is tracked by issue [#2076](https://github.com/dotnet/EntityFramework.Docs/issues/2076). @@ -831,7 +831,7 @@ The Azure Cosmos DB database provider now supports optimistic concurrency using builder.Entity().Property(c => c.ETag).IsEtagConcurrency(); ``` -SaveChanges will then throw an `DbUpdateConcurrencyException` on a concurrency conflict, which [can be handled](https://docs.microsoft.com/ef/core/saving/concurrency) to implement retries, etc. +SaveChanges will then throw an `DbUpdateConcurrencyException` on a concurrency conflict, which [can be handled](/ef/core/saving/concurrency) to implement retries, etc. Documentation is tracked by issue [#2099](https://github.com/dotnet/EntityFramework.Docs/issues/2099).