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