[C#.NET][Entity Framework] 在 Code First 實作具有排序功能的 Guid
POCO Proxy 定義,用 Id 產生具有順序的流水號,用來驗証 Guid 是否能照順序排序:
{ [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Key] public Guid Guid { get; set; } public string Name { get; set; } }
DbContex 實作如下:
{ public DbSet<Employee> Employees { get; set; } public UserDbContext(string contectString) : base(contectString) { } public UserDbContext() : base("localdb") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); Database.SetInitializer(new MyDropCreateDatabaseAlways()); } }
建立假資料:
{ protected override void Seed(UserDbContext context) { base.Seed(context); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "jordan" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "kobe" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "pippen" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "bibby" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "omer" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "rose" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "wade" }); context.Employees.Add(new Employee() { Guid = Guid.NewGuid(), Name = "lin" }); } }
使用 LINQPad 來觀察,操作步驟請參考
http://www.dotblogs.com.tw/yc421206/archive/2014/07/15/145969.aspx
來段小代碼,看看是否有排序功能,我對 Guid 欄位排序,Id 欄位沒有按照順序排列,表示該 Guid 沒有順序性
接著用 dbForge 觀察,Code First 幫我們產生的 T-SQL 語法
在 Guid 欄位加上[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
再跑一次 Guid 排序,這時就可以看到 Id 欄位很有規舉的排好,Guid 欄位的資料看起來都長的好像,這怎麼辦到的?
原來,Code First 幫我們產生的 T-SQL 調用了 T-SQL 裡的newsequentialid 方法
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/07/15/145966.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET