{"id":26984,"date":"2020-03-16T13:26:10","date_gmt":"2020-03-16T20:26:10","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/dotnet\/?p=26984"},"modified":"2020-03-17T10:27:39","modified_gmt":"2020-03-17T17:27:39","slug":"announcing-entity-framework-core-5-0-preview-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-entity-framework-core-5-0-preview-1\/","title":{"rendered":"Announcing Entity Framework Core 5.0 Preview 1"},"content":{"rendered":"<p>Today we are excited to announce the first preview release of <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore\/5.0.0-preview.2.20120.8\">EF Core 5.0<\/a>.<\/p>\n<h2>Prerequisites<\/h2>\n<p>The previews of EF Core 5.0 require .NET Standard 2.1. This means:<\/p>\n<ul>\n<li>EF Core 5.0 runs on .NET Core 3.1; it does not require .NET 5. \n<ul>\n<li>This may change in future previews depending on how the plan for .NET 5 evolves.<\/li>\n<\/ul>\n<\/li>\n<li>EF Core 5.0 runs on other platforms that support <a href=\"https:\/\/docs.microsoft.com\/ef\/core\/platforms\/\">.NET Standard 2.1<\/a>.<\/li>\n<li>EF Core 5.0 will <strong>not<\/strong> run on .NET Standard 2.0 platforms, including .NET Framework.<\/li>\n<\/ul>\n<hr \/>\n<h2>How to get EF Core 5.0 previews<\/h2>\n<p>EF Core is distributed exclusively as a set of NuGet packages. For example, to add the SQL Server provider to your project, you can use the following command using the dotnet tool:<\/p>\n<pre>dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.2.20120.8\n<\/pre>\n<p>The EF Core packages published today are:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore<\/a> &#8211; The main EF Core package<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.SqlServer\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.SqlServer<\/a> &#8211; Database provider for Microsoft SQL Server and SQL Azure<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Sqlite\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Sqlite<\/a> &#8211; Database provider for SQLite<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Cosmos\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Cosmos<\/a> &#8211; Database provider for Azure Cosmos DB<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.InMemory\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.InMemory<\/a> &#8211; The in-memory database provider<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Tools\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Tools<\/a> &#8211; EF Core PowerShell commands for the Visual Studio Package Manager Console<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Design\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Design<\/a> &#8211; Shared design-time components for EF Core tools<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite<\/a> &#8211; SQL Server support for spatial types<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite<\/a> &#8211; SQLite support for spatial types<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Proxies\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Proxies<\/a> &#8211; Lazy-loading and change-tracking proxies<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Abstractions\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Abstractions<\/a> &#8211; Decoupled EF Core abstractions<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Relational\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Relational<\/a> &#8211; Shared EF Core components for relational database providers<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Analyzers\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Analyzers<\/a> &#8211; C# analyzers for EF Core<\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Sqlite.Core\/5.0.0-preview.2.20120.8\">Microsoft.EntityFrameworkCore.Sqlite.Core<\/a> &#8211; Database provider for SQLite without a packaged native binary<\/li>\n<\/ul>\n<p>We have also published the 5.0 preview 1 release of the <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Data.Sqlite.Core\/5.0.0-preview.2.20120.8\">Microsoft.Data.Sqlite.Core<\/a> ADO.NET provider.<\/p>\n<h2>Installing dotnet ef<\/h2>\n<p>As with EF Core 3.0 and 3.1, the dotnet ef command-line tool is no longer included in the .NET Core SDK. Before you can execute EF Core migration or scaffolding commands, you\u2019ll have to install this package as either a global or local tool.<\/p>\n<p>To install the preview tool globally, first uninstall any existing version with:<\/p>\n<pre>dotnet tool uninstall --global dotnet-ef\n<\/pre>\n<p>Then install with:<\/p>\n<pre>dotnet tool install --global dotnet-ef --version 5.0.0-preview.2.20120.8\n<\/pre>\n<p>It\u2019s possible to use this new version of dotnet ef with projects that use older versions of the EF Core runtime.<\/p>\n<hr \/>\n<h2>Package version numbers<\/h2>\n<p>There was a mistake in the .NET 5 build process that resulted in the EF preview 1 packages being erroneously branded as &#8220;5.0.0-preview.2.20120.8&#8221;.<\/p>\n<p>This should not have any functional impact. It should also not impact the real Preview 2, which is still planned for later in the year.<\/p>\n<hr \/>\n<h2>What\u2019s new in EF Core 5 Preview 1<\/h2>\n<p>We maintain documentation covering <a href=\"https:\/\/docs.microsoft.com\/ef\/core\/what-is-new\/ef-core-5.0\/whatsnew\">new features introduced into each preview<\/a>.<\/p>\n<p>Some of the highlights from preview 1 are called out below.<\/p>\n<h3>Simple Logging<\/h3>\n<p>This feature is functionally similar to <code>Database.Log<\/code> in EF6. That is, it provides a simple way to get logs from EF Core without the need to configure any kind of external logging framework.<\/p>\n<p>EF Core replaces <code>Database.Log<\/code> with a <code>LogTo<\/code> method called on DbContextOptionsBuilder in either AddDbContext or OnConfiguring. For example:<\/p>\n<pre><code class=\"csharp\">protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n    =&gt; optionsBuilder.LogTo(Console.WriteLine);\n<\/code><\/pre>\n<p>Overloads exist to:<\/p>\n<ul>\n<li>Set the minimum log level \n<ul>\n<li>Example: <code>.LogTo(Console.WriteLine, LogLevel.Information)<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Filter for only specific events: \n<ul>\n<li>Example: <code>.LogTo(Console.WriteLine, new[] {CoreEventId.ContextInitialized, RelationalEventId.CommandExecuted})<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Filter for all events in specific categories: \n<ul>\n<li>Example: <code>.LogTo(Console.WriteLine, new[] {DbLoggerCategory.Database.Name}, LogLevel.Information)<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Use a custom filter over event and level: \n<ul>\n<li>Example: <code>.LogTo(Console.WriteLine, (id, level) =&gt; id == RelationalEventId.CommandExecuting)<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Output format can be minimally configured (API is in flux) but the default output looks something like:<\/p>\n<pre>warn: 12\/5\/2019 09:57:47.574 CoreEventId.SensitiveDataLoggingEnabledWarning[10400] (Microsoft.EntityFrameworkCore.Infrastructure)\n      Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.\ndbug: 12\/5\/2019 09:57:47.581 CoreEventId.ShadowPropertyCreated[10600] (Microsoft.EntityFrameworkCore.Model.Validation)\n      The property 'BlogId' on entity type 'Post' was created in shadow state because there are no eligible CLR members with a matching name.\ninfo: 12\/5\/2019 09:57:47.618 CoreEventId.ContextInitialized[10403] (Microsoft.EntityFrameworkCore.Infrastructure)\n      Entity Framework Core 5.0.0-dev initialized 'BloggingContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: SensitiveDataLoggingEnabled\ndbug: 12\/5\/2019 09:57:47.644 CoreEventId.ValueGenerated[10808] (Microsoft.EntityFrameworkCore.ChangeTracking)\n      'BloggingContext' generated temporary value '-2147482647' for the 'Id' property of new 'Blog' entity.\n...\n<\/pre>\n<h3>Simple way to get generated SQL<\/h3>\n<p>EF Core 5.0 introduces the <code>ToQueryString<\/code> extension method which will return the SQL that EF Core will generate when executing a LINQ query. For example, the code:<\/p>\n<pre><code class=\"csharp\">var query = context.Set&amp;lt;customer&gt;().Where(c =&gt; c.City == city);\nConsole.WriteLine(query.ToQueryString())\n<\/code><\/pre>\n<p>results in this output when using the SQL Server database provider:<\/p>\n<pre><code class=\"sql\">DECLARE p0 nvarchar(4000) = N'London';\n\nSELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]\nFROM [Customers] AS [c]\nWHERE [c].[City] = @__city_0\n<\/code><\/pre>\n<p>Notice that declarations for parameters of the correct type are also included in the output. This allows copy\/pasting to SQL Server Management Studio, or similar tools, such that the query can be executed for debugging\/analysis.<\/p>\n<h3>Use a C# attribute to indicate that an entity has no key<\/h3>\n<p>An entity type can now be configured as having no key using the new <code>KeylessAttribute<\/code>. For example:<\/p>\n<pre><code class=\"csharp\">[Keyless]\npublic class Address\n{\n    public string Street { get; set; }\n    public string City { get; set; }\n    public int Zip { get; set; }\n}\n<\/code><\/pre>\n<h3>Connection or connection string can be changed on initialized DbContext<\/h3>\n<p>It is now easier to create a DbContext instance without any connection or connection string. Also, the connection or connection string can now be mutated on the context instance. This allows the same context instance to dynamically connect to different databases.<\/p>\n<h3>Change-tracking proxies<\/h3>\n<p>EF Core can now generate runtime proxies that automatically implement <a href=\"https:\/\/docs.microsoft.com\/dotnet\/api\/system.componentmodel.inotifypropertychanging?view=netcore-3.1\">INotifyPropertyChanging<\/a> and <a href=\"https:\/\/docs.microsoft.com\/dotnet\/api\/system.componentmodel.inotifypropertychanged?view=netcore-3.1\">INotifyPropertyChanged<\/a>. 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.<\/p>\n<h3>Enhanced debug views<\/h3>\n<p>Debug views are an easy way to look at the internals of EF Core when debugging issues. A debug view for the Model was implemented some time ago. For EF Core 5.0, we have made the model view easier to read and added a new debug view for tracked entities in the state manager.<\/p>\n<h4>Model debug view<\/h4>\n<p>Drill down into the Model property of the DbContext in your debugger of choice and expand the <code>DebugView<\/code> property.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/user-images.githubusercontent.com\/1430078\/70750412-39bc0a00-1ce3-11ea-9b34-5ab914658b78.png\" alt=\"image\" \/><\/p>\n<p>The <code>LongView<\/code> is the model view we have had for some time. The <code>ShortView<\/code> is new and doesn&#8217;t include model annotations, which make it much easier to read. For example, here is one of our test models:<\/p>\n<pre>Model: \n  EntityType: Chassis\n    Properties: \n      TeamId (int) Required PK FK AfterSave:Throw\n      Name (string)\n      Version (no field, byte[]) Shadow Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate\n    Navigations: \n      Team (_team, Team) ToPrincipal Team Inverse: Chassis PropertyAccessMode.Field\n    Keys: \n      TeamId PK\n    Foreign keys: \n      Chassis {'TeamId'} -> Team {'Id'} Unique ToDependent: Chassis ToPrincipal: Team\n  EntityType: Driver\n    Properties: \n      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd\n      CarNumber (Nullable&lt;int>)\n      Championships (int) Required\n      Discriminator (no field, string) Shadow Required\n      FastestLaps (int) Required\n      Name (string)\n      Podiums (int) Required\n      Poles (int) Required\n      Races (int) Required\n      TeamId (int) Required FK Index\n      Version (no field, byte[]) Shadow Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate\n      Wins (int) Required\n    Navigations: \n      Team (_team, Team) ToPrincipal Team Inverse: Drivers PropertyAccessMode.Field\n    Keys: \n      Id PK\n    Foreign keys: \n      Driver {'TeamId'} -> Team {'Id'} ToDependent: Drivers ToPrincipal: Team\n    Indexes: \n      TeamId\n  EntityType: Engine\n    Properties: \n      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd\n      EngineSupplierId (int) Required FK Index Concurrency\n      Name (string) Concurrency\n    Navigations: \n      EngineSupplier (_engineSupplier, EngineSupplier) ToPrincipal EngineSupplier Inverse: Engines PropertyAccessMode.Field\n      Gearboxes (_gearboxes, ICollection&lt;gearbox>) Collection ToDependent Gearbox PropertyAccessMode.Field\n      StorageLocation (Location) ToDependent Location PropertyAccessMode.Field\n      Teams (_teams, ICollection&lt;team>) Collection ToDependent Team Inverse: Engine PropertyAccessMode.Field\n    Keys: \n      Id PK\n    Foreign keys: \n      Engine {'EngineSupplierId'} -> EngineSupplier {'Id'} ToDependent: Engines ToPrincipal: EngineSupplier\n    Indexes: \n      EngineSupplierId\n  EntityType: EngineSupplier\n    Properties: \n      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd\n      Name (string)\n    Navigations: \n      Engines (_engines, ICollection&lt;engine>) Collection ToDependent Engine Inverse: EngineSupplier PropertyAccessMode.Field\n    Keys: \n      Id PK\n  EntityType: Gearbox\n    Properties: \n      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd\n      EngineId (no field, Nullable&lt;int>) Shadow FK Index\n      Name (string)\n    Keys: \n      Id PK\n    Foreign keys: \n      Gearbox {'EngineId'} -> Engine {'Id'} ToDependent: Gearboxes\n    Indexes: \n      EngineId\n  EntityType: Location\n    Properties: \n      EngineId (no field, int) Shadow Required PK FK AfterSave:Throw ValueGenerated.OnAdd\n      Latitude (double) Required Concurrency\n      Longitude (double) Required Concurrency\n    Keys: \n      EngineId PK\n    Foreign keys: \n      Location {'EngineId'} -> Engine {'Id'} Unique Ownership ToDependent: StorageLocation\n  EntityType: Sponsor\n    Properties: \n      Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd\n      ClientToken (no field, Nullable&lt;\/int>&lt;int>) Shadow Concurrency\n      Discriminator (no field, string) Shadow Required\n      Name (string)\n      Version (no field, byte[]) Shadow Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate\n    Keys: \n      Id PK\n  EntityType: SponsorDetails\n    Properties: \n      TitleSponsorId (no field, int) Shadow Required PK FK AfterSave:Throw ValueGenerated.OnAdd\n      ClientToken (no field, Nullable&lt;\/int>&lt;int>) Shadow Concurrency\n      Days (int) Required\n      Space (decimal) Required\n      Version (no field, byte[]) Shadow Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate\n    Keys: \n      TitleSponsorId PK\n    Foreign keys: \n      SponsorDetails {'TitleSponsorId'} -> TitleSponsor {'Id'} Unique Ownership ToDependent: Details\n  EntityType: Team\n    Properties: \n      Id (int) Required PK AfterSave:Throw\n      Constructor (string)\n      ConstructorsChampionships (int) Required\n      DriversChampionships (int) Required\n      EngineId (no field, Nullable&lt;\/int>&lt;int>) Shadow FK Index\n      FastestLaps (int) Required\n      GearboxId (Nullable&lt;\/int>&lt;int>) FK Index\n      Name (string)\n      Poles (int) Required\n      Principal (string)\n      Races (int) Required\n      Tire (string)\n      Version (no field, byte[]) Shadow Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate\n      Victories (int) Required\n    Navigations: \n      Chassis (_chassis, Chassis) ToDependent Chassis Inverse: Team PropertyAccessMode.Field\n      Drivers (_drivers, ICollection&lt;driver>) Collection ToDependent Driver Inverse: Team PropertyAccessMode.Field\n      Engine (_engine, Engine) ToPrincipal Engine Inverse: Teams PropertyAccessMode.Field\n      Gearbox (_gearbox, Gearbox) ToPrincipal Gearbox PropertyAccessMode.Field\n    Keys: \n      Id PK\n    Foreign keys: \n      Team {'EngineId'} -> Engine {'Id'} ToDependent: Teams ToPrincipal: Engine\n      Team {'GearboxId'} -> Gearbox {'Id'} Unique ToPrincipal: Gearbox\n    Indexes: \n      EngineId\n      GearboxId Unique\n  EntityType: TestDriver Base: Driver\n  EntityType: TitleSponsor Base: Sponsor\n    Navigations: \n      Details (_details, SponsorDetails) ToDependent SponsorDetails PropertyAccessMode.Field\n<\/pre>\n<h4>State manager debug view<\/h4>\n<p>The state manager is a little mode hidden than the model. To find it, drill down into the ChangeTracker property of the DbContext in your debugger of choice and then look in the <code>StateManager<\/code> property and expand the <code>DebugView<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/user-images.githubusercontent.com\/1430078\/70750441-493b5300-1ce3-11ea-9203-2e4b1a3a740e.png\" alt=\"image\" \/><\/p>\n<p>The short view of the state manager shows:<\/p>\n<ul>\n<li>Each entity being tracked<\/li>\n<li>Its primary key value(s)<\/li>\n<li>The entity state &#8211; one of Added, Unchanged, Modified, or Deleted.<\/li>\n<li>The values of an foreign key properties<\/li>\n<\/ul>\n<p>For example:<\/p>\n<pre>Engine (Shared) {Id: 1} Unchanged FK {EngineSupplierId: 1}\nLocation (Shared) {EngineId: 1} Unchanged FK {EngineId: 1}\nTeam (Shared) {Id: 4} Modified FK {EngineId: 1} FK {GearboxId: &lt;null>}\n<\/pre>\n<p>The long view shows everything in the short view together with:<\/p>\n<ul>\n<li>The current value of each property<\/li>\n<li>Whether or not the property is marked as modified<\/li>\n<li>The original value of the property, if different from the current value<\/li>\n<li>The entity referenced by a reference navigation using the referenced entity&#8217;s primary key value<\/li>\n<li>The list if entities referenced by a collection navigation, again using primary key values<\/li>\n<\/ul>\n<p>For example:<\/p>\n<pre>Engine (Shared) {Id: 1} Unchanged\n  Id: 1 PK\n  EngineSupplierId: 1 FK\n  Name: 'FO 108X'\n  EngineSupplier: &lt;null>\n  Gearboxes: &lt;\/null>&lt;null>\n  StorageLocation: {EngineId: 1}\n  Teams: [{Id: 4}]\nLocation (Shared) {EngineId: 1} Unchanged\n  EngineId: 1 PK FK\n  Latitude: 47.64491\n  Longitude: -122.128101\nTeam (Shared) {Id: 4} Modified\n  Id: 4 PK\n  Constructor: 'Ferrari'\n  ConstructorsChampionships: 16\n  DriversChampionships: 15\n  EngineId: 1 FK Modified Originally 3\n  FastestLaps: 221\n  GearboxId: &lt;\/null>&lt;null> FK\n  Name: 'Scuderia Ferrari Marlboro'\n  Poles: 203\n  Principal: 'Stefano Domenicali'\n  Races: 805\n  Tire: 'Bridgestone'\n  Version: '0x000000000001405A'\n  Victories: 212\n  Chassis: &lt;\/null>&lt;null>\n  Drivers: []\n  Engine: {Id: 1}\n  Gearbox: &lt;\/null>&lt;null>\n<\/pre>\n<h3>Improved handling of database null semantics<\/h3>\n<p>Relational databases typically treat NULL as an unknown value and therefore not equal to any other NULL. C#, on the other hand, treats null as a defined value which compares equal to any other null. EF Core by default translates queries so that they use C# null semantics. EF Core 5.0 greatly improves the efficiency of these translations.<\/p>\n<h3>Indexer properties<\/h3>\n<p>EF Core 5.0 supports mapping of C# indexer properties. This allows entities to act as property bags where columns are mapped to named properties in the bag.<\/p>\n<h3>Generation of check constraints for enum mappings<\/h3>\n<p>EF Core 5.0 Migrations can now generate CHECK constraints for enum property mappings. For example:<\/p>\n<pre><code class=\"sql\">EnumColumn VARCHAR(10) NOT NULL CHECK (MyEnumColumn IN('Useful', 'Useless', 'Unknown'))\n<\/code><\/pre>\n<h3>IsRelational<\/h3>\n<p>A new <code>IsRelational<\/code> method has been added in addition to the existing <code>IsSqlServer<\/code>, <code>IsSqlite<\/code>, and <code>IsInMemory<\/code>. This can be used to test if the DbContext is using any relational database provider. For example:<\/p>\n<pre><code class=\"csharp\">protected override void OnModelCreating(ModelBuilder modelBuilder)\n{\n    if (Database.IsRelational())\n    {\n        \/\/ Do relational-specific model configuration.\n    }\n}\n<\/code><\/pre>\n<h3>Cosmos optimistic concurrency with ETags<\/h3>\n<p>The Azure Cosmos DB database provider now supports optimistic concurrency using ETags. Use the model builder in OnModelCreating to configure an ETag:<\/p>\n<pre><code class=\"csharp\">builder.Entity&amp;lt;customer&gt;().Property(c =&gt; c.ETag).IsEtagConcurrency();\n<\/code><\/pre>\n<p>SaveChanges will then throw an <code>DbUpdateConcurrencyException<\/code> on a concurrency conflict, which <a href=\"https:\/\/docs.microsoft.com\/ef\/core\/saving\/concurrency\">can be handled<\/a> to implement retries, etc.<\/p>\n<h3>Query translations for more DateTime constructs<\/h3>\n<p>Queries containing new DateTime construction are now translated.<\/p>\n<p>In addition, the following SQL Server functions are now mapped: * DateDiffWeek * DateFromParts<\/p>\n<p>For example:<\/p>\n<pre><code class=\"csharp\">var count = context.Orders.Count(c =&gt; date &gt; EF.Functions.DateFromParts(DateTime.Now.Year, 12, 25));\n<\/code><\/pre>\n<h3>Query translations for more byte array constructs<\/h3>\n<p>Queries using Contains, Length, SequenceEqual, etc. on byte[] properties are now translated to SQL. For example:<\/p>\n<pre><code class=\"csharp\">var blogs = context.Blogs.Where(e =&gt; e.Picture.Contains((byte)127)).ToList();\n<\/code><\/pre>\n<h3>Query translation for Reverse<\/h3>\n<p>Queries using <code>Reverse<\/code> are now translated. For example:<\/p>\n<pre><code class=\"csharp\">context.Employees.OrderBy(e =&gt; e.EmployeeID).Reverse()\n<\/code><\/pre>\n<h3>Query translation for bitwise operators<\/h3>\n<p>Queries using bitwise operators are now translated in more cases. For example:<\/p>\n<pre><code class=\"csharp\">context.Orders.Where(o =&gt; ~o.OrderID == negatedId)\n<\/code><\/pre>\n<h3>Query translation for strings on Cosmos<\/h3>\n<p>Queries that use the string methods Contains, StartsWith, and EndsWith are now translated when using the Azure Cosmos DB provider.<\/p>\n<hr \/>\n<h2>Daily builds<\/h2>\n<p>EF Core previews are aligned with .NET 5 previews. These previews tend to lag behind the latest work on EF Core. Consider using the <a href=\"https:\/\/github.com\/aspnet\/AspNetCore\/blob\/master\/docs\/DailyBuilds.md\">daily builds<\/a> instead to get the most up-to-date EF Core features and bug fixes.<\/p>\n<p>As with the previews, the daily builds do not require .NET 5; they can be used with GA\/RTM release of .NET Core 3.1.<\/p>\n<hr \/>\n<h2>Documentation and feedback<\/h2>\n<p>The starting point for all EF Core documentation is <a href=\"https:\/\/docs.microsoft.com\/ef\/core\/\">docs.microsoft.com\/ef\/core\/<\/a>.<\/p>\n<p>Please file issues found and any other feedback on the <a href=\"https:\/\/github.com\/dotnet\/efcore\">dotnet\/efcore GitHub repo<\/a>.<\/p>\n<hr \/>\n<h2>Thank you from the team!<\/h2>\n<p>A big thank you from the EF team to everyone who has used EF over the years!<\/p>\n<table>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/ajcvickers\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_ajcvickers.jpeg\" alt=\"ajcvickers\" width=200px\/><br \/>Arthur Vickers<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/AndriySvyryd\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_AndriySvyryd.jpeg\" alt=\"AndriySvyryd\" width=200px\/><br \/>Andriy Svyryd<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/bricelam\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_bricelam.jpeg\" alt=\"\" width=200px\/><br \/>Brice Lambson<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/JeremyLikness\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_JeremyLikness.jpeg\" alt=\"JeremyLikness\" width=200px\/><br \/>Jeremy Likness<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/lajones\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_lajones.jpeg\" alt=\"lajones\" width=200px\/><br \/>lajones<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/maumar\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_maumar.jpeg\" alt=\"maumar\" width=200px\/><br \/>Maurycy Markowski<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/roji\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_roji-1-300x300.png\" alt=\"roji\" width=200px\/><br \/>Shay Rojansky<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/smitpatel\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/efteam_smitpatel.png\" alt=\"smitpatel\" width=200px\/><br \/>Smit Patel<\/a>\n    <\/td>\n<\/tr>\n<\/table>\n<hr \/>\n<h2>Thank you to our contributors!<\/h2>\n<p>A big thank you to the following community members who have already contributed code or documentation to the EF Core 5 release!<\/p>\n<table>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/aevitas\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_aevitas.jpeg\" alt=\"aevitas\" width=200px\/><br \/>aevitas<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/alaatm\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_alaatm.png\" alt=\"alaatm\" width=200px\/><br \/>Alaa Masoud<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/aleksandar-manukov\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_aleksandar-manukov.png\" alt=\"aleksandar-manukov\" width=200px\/><br \/>Aleksandar Manukov<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/amrbadawy\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_amrbadawy.jpeg\" alt=\"amrbadawy\" width=200px\/><br \/>Amr Badawy<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/AnthonyMonterrosa\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_AnthonyMonterrosa.jpeg\" alt=\"AnthonyMonterrosa\" width=200px\/><br \/>Anthony Monterrosa<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/bbrandt\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_bbrandt.jpeg\" alt=\"bbrandt\" width=200px\/><br \/>Ben Brandt<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/benmccallum\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_benmccallum.jpeg\" alt=\"benmccallum\" width=200px\/><br \/>Ben McCallum<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/ccjx\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ccjx.png\" alt=\"ccjx\" width=200px\/><br \/>Clarence Cai<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/CGijbels\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_CGijbels.jpeg\" alt=\"CGijbels\" width=200px\/><br \/>Christophe Gijbels<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/cincuranet\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_cincuranet.png\" alt=\"cincuranet\" width=200px\/><br \/>Jiri Cincura<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/Costo\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_Costo.jpeg\" alt=\"Costo\" width=200px\/><br \/>Vincent Costel<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/dshuvaev\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_dshuvaev.jpeg\" alt=\"dshuvaev\" width=200px\/><br \/>Dmitry Shuvaev<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/EricStG\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_EricStG.jpeg\" alt=\"EricStG\" width=200px\/><br \/>Eric St-Georges<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/ErikEJ\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ErikEJ.jpeg\" alt=\"ErikEJ\" width=200px\/><br \/>Erik Ejlskov Jensen<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/gravbox\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_gravbox.png\" alt=\"gravbox\" width=200px\/><br \/>Christopher Davis<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/ivaylokenov\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ivaylokenov.jpeg\" alt=\"ivaylokenov\" width=200px\/><br \/>Ivaylo Kenov<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/jfoshee\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_jfoshee.png\" alt=\"jfoshee\" width=200px\/><br \/>Jacob Foshee<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/jmzagorski\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_jmzagorski.png\" alt=\"jmzagorski\" width=200px\/><br \/>Jeremy Zagorski<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/jviau\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_jviau.jpeg\" alt=\"jviau\" width=200px\/><br \/>Jacob Viau<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/knom\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_knom.png\" alt=\"knom\" width=200px\/><br \/>Max K.<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/lohoris-crane\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_lohoris-crane.jpeg\" alt=\"lohoris-crane\" width=200px\/><br \/>lohoris-crane<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/loic-sharma\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_loic-sharma.jpeg\" alt=\"loic-sharma\" width=200px\/><br \/>Lo\u00efc Sharma<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/lokalmatador\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_lokalmatador.jpeg\" alt=\"lokalmatador\" width=200px\/><br \/>lokalmatador<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/mariusGundersen\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_mariusGundersen.png\" alt=\"mariusGundersen\" width=200px\/><br \/>Marius Gundersen<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/Marusyk\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_Marusyk.jpeg\" alt=\"Marusyk\" width=200px\/><br \/>Roman Marusyk<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/matthiaslischka\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_matthiaslischka.jpeg\" alt=\"matthiaslischka\" width=200px\/><br \/>Matthias Lischka<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/MaxG117\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_MaxG117.png\" alt=\"MaxG117\" width=200px\/><br \/>MaxG117<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/MHDuke\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_MHDuke.jpeg\" alt=\"MHDuke\" width=200px\/><br \/>MHDuke<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/mikes-gh\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_mikes-gh.png\" alt=\"mikes-gh\" width=200px\/><br \/>Mike Surcouf<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/Muppets\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_Muppets.jpeg\" alt=\"Muppets\" width=200px\/><br \/>Neil Bostrom<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/nmichels\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_nmichels.jpeg\" alt=\"nmichels\" width=200px\/><br \/>N\u00edcolas Michels<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/OOberoi\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_OOberoi.jpeg\" alt=\"OOberoi\" width=200px\/><br \/>Obi Oberoi<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/orionstudt\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_orionstudt.jpeg\" alt=\"orionstudt\" width=200px\/><br \/>Josh Studt<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/ozantopal\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ozantopal.jpeg\" alt=\"ozantopal\" width=200px\/><br \/>Ozan Topal<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/pmiddleton\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_pmiddleton.jpeg\" alt=\"pmiddleton\" width=200px\/><br \/>Paul Middleton<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/prog-rajkamal\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_prog-rajkamal.jpeg\" alt=\"prog-rajkamal\" width=200px\/><br \/>Raj<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/ptjhuang\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ptjhuang.png\" alt=\"ptjhuang\" width=200px\/><br \/>Peter Huang<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/ralmsdeveloper\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_ralmsdeveloper.png\" alt=\"ralmsdeveloper\" width=200px\/><br \/>Rafael Almeida Santos<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/redoz\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_redoz.png\" alt=\"redoz\" width=200px\/><br \/>Patrik Husfloen<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/rmarskell\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_rmarskell.jpeg\" alt=\"rmarskell\" width=200px\/><br \/>Richard Marskell<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/sguitardude\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_sguitardude.jpeg\" alt=\"sguitardude\" width=200px\/><br \/>sguitardude<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/SimpleSamples\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_SimpleSamples.png\" alt=\"SimpleSamples\" width=200px\/><br \/>Sam Hobbs<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/svengeance\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_svengeance.png\" alt=\"svengeance\" width=200px\/><br \/>Sven<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/VladDragnea\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_VladDragnea.jpeg\" alt=\"VladDragnea\" width=200px\/><br \/>Vlad<\/a>\n    <\/td>\n<\/tr>\n<tr>\n<td>\n      <a href=\"https:\/\/github.com\/vslee\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_vslee.png\" alt=\"vslee\" width=200px\/><br \/>vslee<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/WeihanLi\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_WeihanLi.jpeg\" alt=\"WeihanLi\" width=200px\/><br \/>liweihan<\/a>\n    <\/td>\n<td>\n      <a href=\"https:\/\/github.com\/Youssef1313\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2020\/03\/contributor_Youssef1313.jpeg\" alt=\"Youssef1313\" width=200px\/><br \/>Youssef Victor<\/a>\n    <\/td>\n<\/tr>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Today we are excited to announce the first preview release of EF Core 5.0. Prerequisites The previews of EF Core 5.0 require .NET Standard 2.1. This means: EF Core 5.0 runs on .NET Core 3.1; it does not require .NET 5. This may change in future previews depending on how the plan for .NET 5 [&hellip;]<\/p>\n","protected":false},"author":13047,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[859],"tags":[30,70,71],"class_list":["post-26984","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entity-framework","tag-announcement","tag-entity-framework","tag-entity-framework-core"],"acf":[],"blog_post_summary":"<p>Today we are excited to announce the first preview release of EF Core 5.0. Prerequisites The previews of EF Core 5.0 require .NET Standard 2.1. This means: EF Core 5.0 runs on .NET Core 3.1; it does not require .NET 5. This may change in future previews depending on how the plan for .NET 5 [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/26984","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/13047"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=26984"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/26984\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=26984"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=26984"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=26984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}