diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 7fa1b00d00..6e49c181d8 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -289,6 +289,11 @@ "source_path": "entity-framework/core/modeling/relational/unique-constraints.md", "redirect_url": "/ef/core/modeling/keys", "redirect_document_id": false + }, + { + "source_path": "entity-framework/core/modeling/relational/sequences.md", + "redirect_url": "/ef/core/modeling/sequences", + "redirect_document_id": false } ] } diff --git a/entity-framework/core/modeling/relational/sequences.md b/entity-framework/core/modeling/relational/sequences.md deleted file mode 100644 index 7c1d4af8ac..0000000000 --- a/entity-framework/core/modeling/relational/sequences.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Sequences - EF Core -author: rowanmiller -ms.date: 10/27/2016 -ms.assetid: 94f81a92-3c72-4e14-912a-f99310374e42 -uid: core/modeling/relational/sequences ---- -# Sequences - -> [!NOTE] -> The configuration in this section is applicable to relational databases in general. The extension methods shown here will become available when you install a relational database provider (due to the shared *Microsoft.EntityFrameworkCore.Relational* package). - -A sequence generates a sequential numeric values in the database. Sequences are not associated with a specific table. - -## Conventions - -By convention, sequences are not introduced in to the model. - -## Data Annotations - -You can not configure a sequence using Data Annotations. - -## Fluent API - -You can use the Fluent API to create a sequence in the model. - -[!code-csharp[Main](../../../../samples/core/Modeling/FluentAPI/Relational/Sequence.cs?name=Model&highlight=7)] - -You can also configure additional aspect of the sequence, such as its schema, start value, and increment. - -[!code-csharp[Main](../../../../samples/core/Modeling/FluentAPI/Relational/SequenceConfigured.cs?name=Sequence&highlight=7,8,9)] - -Once a sequence is introduced, you can use it to generate values for properties in your model. For example, you can use [Default Values](default-values.md) to insert the next value from the sequence. - -[!code-csharp[Main](../../../../samples/core/Modeling/FluentAPI/Relational/SequenceUsed.cs?name=Default&highlight=13)] diff --git a/entity-framework/core/modeling/sequences.md b/entity-framework/core/modeling/sequences.md new file mode 100644 index 0000000000..d77294f8b8 --- /dev/null +++ b/entity-framework/core/modeling/sequences.md @@ -0,0 +1,27 @@ +--- +title: Sequences - EF Core +author: roji +ms.date: 12/18/2019 +ms.assetid: 94f81a92-3c72-4e14-912a-f99310374e42 +uid: core/modeling/sequences +--- +# Sequences + +> [!NOTE] +> Sequences are a feature typically supported only by relational databases. If you're using a non-relational database such as Cosmos, check your database documentation on generating unique values. + +A sequence generates unique, sequential numeric values in the database. Sequences are not associated with a specific table, and multiple tables can be set up to draw values from the same sequence. + +## Basic usage + +You can set up a sequence in the model, and then use it to generate values for properties: + +[!code-csharp[Main](../../../samples/core/Modeling/FluentAPI/Sequence.cs?name=Sequence&highlight=3,7)] + +Note that the specific SQL used to generate a value from a sequence is database-specific; the above example works on SQL Server but will fail on other databases. Consult your specific database's documentation for more information. + +## Configuring sequence settings + +You can also configure additional aspects of the sequence, such as its schema, start value, increment, etc.: + +[!code-csharp[Main](../../../samples/core/Modeling/FluentAPI/SequenceConfiguration.cs?name=SequenceConfiguration&highlight=3-5)] diff --git a/entity-framework/toc.yml b/entity-framework/toc.yml index ef225c98df..e11aa28a29 100644 --- a/entity-framework/toc.yml +++ b/entity-framework/toc.yml @@ -97,6 +97,8 @@ href: core/modeling/indexes.md - name: Inheritance href: core/modeling/inheritance.md + - name: Sequences + href: core/modeling/sequences.md - name: Backing Fields href: core/modeling/backing-field.md - name: Value Conversions @@ -122,8 +124,6 @@ href: core/modeling/relational/index.md - name: Computed Columns href: core/modeling/relational/computed-columns.md - - name: Sequences - href: core/modeling/relational/sequences.md - name: Default Values href: core/modeling/relational/default-values.md - name: Inheritance (Relational Database) diff --git a/samples/core/Modeling/FluentAPI/Relational/SequenceUsed.cs b/samples/core/Modeling/FluentAPI/Relational/SequenceUsed.cs deleted file mode 100644 index 8d49df279c..0000000000 --- a/samples/core/Modeling/FluentAPI/Relational/SequenceUsed.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace EFModeling.FluentAPI.Relational.SequenceUsed -{ - #region Default - class MyContext : DbContext - { - public DbSet Orders { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.HasSequence("OrderNumbers", schema: "shared") - .StartsAt(1000) - .IncrementsBy(5); - - modelBuilder.Entity() - .Property(o => o.OrderNo) - .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers"); - } - } - - public class Order - { - public int OrderId { get; set; } - public int OrderNo { get; set; } - public string Url { get; set; } - } - #endregion -} diff --git a/samples/core/Modeling/FluentAPI/Relational/Sequence.cs b/samples/core/Modeling/FluentAPI/Sequence.cs similarity index 71% rename from samples/core/Modeling/FluentAPI/Relational/Sequence.cs rename to samples/core/Modeling/FluentAPI/Sequence.cs index 62c6569516..6b81d14a47 100644 --- a/samples/core/Modeling/FluentAPI/Relational/Sequence.cs +++ b/samples/core/Modeling/FluentAPI/Sequence.cs @@ -2,15 +2,20 @@ namespace EFModeling.FluentAPI.Relational.Sequence { - #region Model class MyContext : DbContext { public DbSet Orders { get; set; } + #region Sequence protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasSequence("OrderNumbers"); + + modelBuilder.Entity() + .Property(o => o.OrderNo) + .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers"); } + #endregion } public class Order @@ -19,5 +24,4 @@ public class Order public int OrderNo { get; set; } public string Url { get; set; } } - #endregion } diff --git a/samples/core/Modeling/FluentAPI/Relational/SequenceConfigured.cs b/samples/core/Modeling/FluentAPI/SequenceConfiguration.cs similarity index 81% rename from samples/core/Modeling/FluentAPI/Relational/SequenceConfigured.cs rename to samples/core/Modeling/FluentAPI/SequenceConfiguration.cs index bf58359b31..de4c914275 100644 --- a/samples/core/Modeling/FluentAPI/Relational/SequenceConfigured.cs +++ b/samples/core/Modeling/FluentAPI/SequenceConfiguration.cs @@ -1,20 +1,20 @@ using Microsoft.EntityFrameworkCore; -namespace EFModeling.FluentAPI.Relational.SequenceConfigured +namespace EFModeling.FluentAPI.Relational.SequenceConfiguration { - #region Sequence class MyContext : DbContext { public DbSet Orders { get; set; } + #region SequenceConfiguration protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasSequence("OrderNumbers", schema: "shared") .StartsAt(1000) .IncrementsBy(5); } + #endregion } - #endregion public class Order {