日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Entity Framework Core 使用HiLo生成主键

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Entity Framework Core 使用HiLo生成主键 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HiLo是在NHibernate中生成主鍵的一種方式,不過現在我們可以在Entity Framework Core中使用。所以在這篇內容中,我將向您在介紹如何在Entity Framework Core中使用HiLo生成主鍵。

什么是Hilo?

HiLo是High Low的簡寫,翻譯成中文叫高低位模式。

HiLo是由“Hi”和“Lo”兩部分生成主鍵的一種模式。“Hi”部分來自數據庫,“Lo”部分在內存中生成以創建唯一值。請記住,“Lo”是一個范圍數字,如0-100。因此,當“Hi”部分用完“Lo”范圍時,再次進行數據庫調用以獲得下一個“Hi數字”。所以HiLo模式的優點在于您預先可以知道主鍵的值,而不用每次都與數庫據發生交互

總結有以下四點:

  • “Hi”部分由數據庫分配,兩個并發請求保證得到唯一的連續值;

  • 一旦獲取“Hi”部分,我們還需要知道“incrementSize”的值(“Lo”條目的數量);
    “Lo”取的范圍:[0,incrementSize];

  • 標識范圍的公式是:(Hi - 1) * incrementSize) + 1?到?(Hi - 1) * incrementSize) + incrementSize)

  • 當所有“Lo”值使用完時,需要重新從數據庫中取出一個新的“Hi”值,并將“Lo”部分重置為0。

  • 在這里演示在兩個并發事務中的例子,每個事務插入多個實體:

    Sql Server 序列

    在EF Core中使用HiLo生成主鍵,我們還需要了解Sql Server中一個概念序列(Sequence)

    序列是在SQL Server 2012中引入的(不過Oracle很早就已經實現了http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm)。序列是用戶定義的對象,它根據創建的屬性生成一系列數值。它與?Identity?列相似,但它們之間有很多不同之處。例如,

    • 序列用于生成數據庫范圍的序列號;

    • 序列不與一個表相關聯,您可以將其與多個表相關聯;

    • 它可以用于插入語句來插入標識值,也可以在T-SQL腳本中使用。

    創建序列示例的SQL語句:

    Create Sequence [dbo].[Sequence_Test] As [BigInt] ? ? ? ? --整數類型Start With 1 ? ? ? ?--起始值Increment By 1 ? ? ?--增量值MinValue 1 ? ? ? ? ?--最小值MaxValue 9999999 ? ?--最大值Cycle ? ? ? ? ? ? ? --達到最值循環 [ CYCLE | NO CYCLE ]Cache ?5; ? ? ? ? ? --每次取出5個值緩存使用 [ CACHE [<常量>] | NO CACHE ]

    使用示例:

    Create Table #T(Id BigInt Primary Key,[Time] DateTime);Insert Into #T( Id , Time )Values ? ? ?( NEXT VALUE FOR [dbo].[Sequence_Test] , -- Id - bigintGetDate() ?-- Time - datetime)Go 10Select * From #T

    查詢結果:

    Id Time
    1 2017-11-23 16:46:50.613
    2 2017-11-23 16:46:50.643
    3 2017-11-23 16:46:50.667
    4 2017-11-23 16:46:50.677
    5 2017-11-23 16:46:50.687
    6 2017-11-23 16:46:50.697
    7 2017-11-23 16:46:50.707
    8 2017-11-23 16:46:50.717
    9 2017-11-23 16:46:50.730
    10 2017-11-23 16:46:50.740

    關于序列更多的內容,可以查閱如下資料:

    • http://www.cnblogs.com/CareySon/archive/2012/03/12/2391581.html

    • http://www.cnblogs.com/dotnet261010/p/7082852.html

    • http://sqlhints.com/2015/08/01/difference-between-sequence-and-identity-in-sql-server/

    • https://raresql.com/2012/05/01/difference-between-identity-and-sequence/

    使用HiLo生成主鍵

    讓我們看看如何使用HiLo在Entity Framework Core中生成主鍵。

    為了演示,我們創建了兩個沒有關系的實體。

    ? ?public class Category{ ? ? ?
    ? ??public int CategoryID { get; set; } ? ? ?
    ? ? ?public string CategoryName { get; set; }} ? ?public class Product{ ? ? ?
    ? ? ? ?public int ProductID { get; set; } ?
    ? ? ?? ?
    ? ? ?? ? ?public string ProductName { get; set; }}

    請記住,EF Core按慣例配置一個名為Id<type name>Id作為實體的主鍵屬性。現在我們需要創建我們的DBContext,在這里我們創建SampleDBContext.cs類:

    public class SampleDBContext : DbContext{ ?
    ?public SampleDBContext() ? ?{Database.EnsureDeleted();Database.EnsureCreated();} ? ?protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder) ? ?{ ? ? ? ? ? ?var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {DataSource = "****",InitialCatalog = "EFSampleDB",UserID = "sa",Password = "***"};optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);} ? ?protected override void OnModelCreating(ModelBuilder modelbuilder) ? ?{modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo");} ? ?public DbSet<Product> Products { get; set; } ? ?public DbSet<Category> Categories { get; set; } }
    • 在SampleDBContext構造函數初始化數據庫,類型于EF 6中的DropCreateDatabaseAlways;

    • OnConfiguring()?方法用于配置數據庫鏈接字符串;

    • OnModelCreating方法用于定義實體模型。要定義HiLo序列,請使用ForSqlServerUseSequenceHiLo擴展方法。您需要提供序列的名稱。

    運行應用程序,您應該在創建“EFSampleDB”數據庫中看到Product表、Category表和DBSequenceHiLo序列。

    以下是創建DBSequenceHiLo的腳本。

    Create Sequence [dbo].[DBSequenceHiLo] As [BigInt] Start With 1Increment By 10MinValue -9223372036854775808MaxValue 9223372036854775807Cache Go

    正如你所看到的,它從1開始,遞增是10。

    現在向數據庫中添加一些數據。以下代碼首先添加3個Category實體和調用SaveChanges(),然后添加3個Product實體并調用SaveChanges()。

    ? ?using (var dataContext = new SampleDBContext()){dataContext.Categories.Add(new Category() { CategoryName = "Clothing" });dataContext.Categories.Add(new Category() { CategoryName = "Footwear" });dataContext.Categories.Add(new Category() { CategoryName = "Accessories" });dataContext.SaveChanges();dataContext.Products.Add(new Product() { ProductName = "TShirts" });dataContext.Products.Add(new Product() { ProductName = "Shirts" });dataContext.Products.Add(new Product() { ProductName = "Causal Shoes" });dataContext.SaveChanges();}

    當這個代碼第一次被執行,Clothing?實體通過Add方法增加到DBContext時,就會向數據庫調用獲取序列的值,我們也可以通過SQL Server Profiler來驗證它。

    次調用dataContext.SaveChanges()時,3個Category實體將被保存。查看執行的SQL語句。主鍵值已經被生成,序列值的獲取也只執行了一次。

    即使插入3個Product實體,序列值也不會從數據庫中獲取。只有當插入10條記錄(Lo部分耗盡)時,才會向數據庫調用獲得下一個(Hi部分)序列值。

    向HiLo運用到單個實體

    上面的代碼兩個表共用一個HiLo序列。如果您只想針對一個特定的表,那么您可以使用下面的代碼。

    ? ?modelbuilder.Entity<Category>().Property(o => o.CategoryID).ForSqlServerUseSequenceHiLo();

    這段代碼將創建一個默認名稱為“EntityFrameworkHiLoSequence”的新序列,因為沒有指定名字。您也可以定義多個HiLo序列。例如:

    ? ?protected override void OnModelCreating(ModelBuilder modelbuilder) ? ?{modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo");modelbuilder.Entity<Category>().Property(o => o.CategoryID).ForSqlServerUseSequenceHiLo();}

    在數據庫中,將創建兩個序列。Category實體將使用EntityFrameworkHiLoSequence序號,所有其它實體使用DBSequenceHiLo序列。

    配置HiLo序列

    ForSqlServerHasSequence擴展方法不能更改起始值和增量值的選項。但是,有一種方法來定義這些選項。首先,使用HasSequence方法定義序列的StartAt和IncrementBy選項,然后再使用ForSqlServerUseSequenceHiLo()擴展方法,要保持序列的名稱一致。例如:

    ? ?modelbuilder.HasSequence<int>("DBSequenceHiLo").StartsAt(1000).IncrementsBy(5);modelbuilder.ForSqlServerUseSequenceHiLo("DBSequenceHiLo");

    在這種情況下,生成DBSequenceHiLo的腳本如下。

    CREATE SEQUENCE [dbo].[DBSequenceHiLo] AS [int] START WITH 1000INCREMENT BY 5MINVALUE -2147483648MAXVALUE 2147483647CACHE GO

    所以當我們執行相同的代碼插入3個Category實體,那么主鍵的值將從1000開始。

    而且由于IncrementBy選項設置為“5”,所以當在上下文中添加第6個插入時,將進行數據庫調用以獲得下一個序列值。以下是插入3個Category實體然后插入3個的Product實體時SQL Server profiler的屏幕截圖,您可以看到數據庫調用獲取序列的下一個值的次數是2次。

    如果您對在Entity Framework Core中使用HiLo生成主鍵感興趣,不防自己動手測試一下。

    參考資料:

    • https://vladmihalcea.com/2014/06/23/the-hilo-algorithm/

    • http://www.talkingdotnet.com/use-hilo-to-generate-keys-with-entity-framework-core/


    原文:http://www.cnblogs.com/tdfblog/p/entity-framework-core-hilo.html


    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


    總結

    以上是生活随笔為你收集整理的Entity Framework Core 使用HiLo生成主键的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: www 在线观看视频 | 91观看视频| 国产黄色网页 | 筱田优全部av免费观看 | 美女扒开尿口让男人桶 | 法国性xxxx精品hd | 久久久久99精品成人片试看 | 毛片毛片毛片毛片毛片毛片毛片 | 欧美深夜在线 | www.17c.com喷水少妇 | www.国产黄色 | 蜜桃tv在线观看 | 自拍偷拍一区二区三区 | 亚洲女人网 | 成人午夜视频免费看 | 青青草国产精品视频 | 久草视频资源 | 亚洲一区二区三区影视 | 阿v天堂2014 这里有精品 | 天堂久久一区 | 中文字幕精品一二三四五六七八 | 亚洲精品乱码久久久久久蜜桃图片 | 在线视频亚洲欧美 | 青青草成人网 | 天天操夜夜撸 | 午夜成人鲁丝片午夜精品 | 欧美做受高潮中文字幕 | 毛片网 | 亚洲成人高清 | julia中文字幕在线 | 神马伦理影视 | 国内精品人妻无码久久久影院蜜桃 | 3d动漫精品啪啪一区二区下载 | 亚洲AV无码国产精品午夜字幕 | 欧美一区二区三区网站 | 国产无码精品在线观看 | 少妇精品视频 | 国产中文在线观看 | 久久久噜噜噜久久 | 波多野结衣一区二区三区 | 综合狠狠 | 51免费看成人啪啪片 | 亚洲在线不卡 | 一区二区三区在线视频播放 | 性生活一级大片 | 日韩大片免费看 | 国产成人免费av | 日本在线视频二区 | 天天射寡妇 | 五月婷婷激情综合 | 色婷婷av国产精品 | 亚洲成人精品久久久 | 日日干狠狠干 | 夜夜久久| 超碰99热| 亚洲精品在线91 | 天天天天天天天干 | 免费超爽大片黄 | 日韩成人免费在线观看 | 国产成人无码一区二区在线播放 | 人人插人人| 日本大尺度做爰呻吟舌吻 | 日日嗨av一区二区三区四区 | 日本a级无毛 | 成年人a级片 | 在线一区不卡 | 日韩黄色片在线观看 | 69福利社区| 岛国av不卡 | 亚洲色图少妇 | caoprom在线视频| 欧美大片在线免费观看 | 刘玥91精选国产在线观看 | 精品久久久久久中文字幕人妻最新 | 欧美日韩亚洲激情 | 伊人久久中文字幕 | 色呦呦一区二区三区 | 日韩不卡在线视频 | 麻豆视频精品 | 美日韩免费 | 少妇又白又嫩又色又粗 | 一区二区三区福利视频 | 宅男av在线| 久久九九国产视频 | 老王66福利网 | 不卡视频一区二区 | 欧美 国产 精品 | 少妇视频在线播放 | 超碰97自拍 | 成人国产一区二区三区 | 色噜噜狠狠狠综合曰曰曰 | 国产精品无码久久久久 | 在线国产黄色 | 中国一级片黄色一级片黄 | 99色综合网| 三级三级久久三级久久18 | 黄色av影视| 亚洲一区电影 | 天天干天天操天天摸 |