How to implement Guid.Comb on SQL Server with Entity Framework Code First
2 min read
Read this if you don’t know the “why” behind Guid.Comb. In a nutshell. We want to uniquely identify records and don’t want PK collisions across database instances. Using Guid as a PK used to be taboo. Now (circa 2002) it’s acceptable with Guid.Comb. It generates Guids in a semi-sequential order to limit page splits. This post is a combination of this and this.
Download Latest version from GitHub
What I’m using:
- EF 6 beta3 – Though you could probably use EF5 without issue
- VS2012 – Express should work
- SQL Express
- Nuget
1. Create a new Console App called GuidComb
2. Open Package Manager Console and run the following:
PM> Install-Package EntityFramework -Pre
3. Add this code to your app:
using System;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Data.Entity;
namespace GuidComb{ class Program { static void Main(string[] args) { using (var db = new ItemContext()) { for (var i = 0; i < 10; i++) db.Items.Add(new Item());
db.SaveChanges(); }
using (var db = new ItemContext()) { foreach (var item in db.Items) Console.WriteLine(item.Id); }
Console.ReadKey(); } }
public class Item { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } }
public class ItemContext : DbContext { public DbSet<Item> Items { get; set; } }}
```text
4\. Run the following in Package Manager Console
> PM> Enable-Migrations
5\. Run the following in Package Manager Console
> PM> Add-Migration Comb
6\. Open the /Migrations/\[Timestamp\]\_Comb.cs that was created by the Add-Migration command and add defaultValueSql: “newsequentialid()” to the Item table Column builder.
```csharp
namespace GuidComb.Migrations{ using System; using System.Data.Entity.Migrations;
public partial class Comb : DbMigration { public override void Up() { CreateTable( "dbo.Items", c => new { Id = c.Guid(nullable: false, identity: true, defaultValueSql: "newsequentialid()"), }) .PrimaryKey(t => t.Id);
}
public override void Down() { DropTable("dbo.Items"); } }}7. Hit F5 and you should see this:

As you can see the Guid are being generated sequentially.
Share: