有没有办法使用CodeFirst设计为新的Entity Framework 4.1中的对象实现Guid COMB身份策略?我认为设置StoreGeneratedPattern会工作,但它仍然给我正常的GUID.
如何newsequentialid()在PK列中使用默认值?
我有这个注释:
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Run Code Online (Sandbox Code Playgroud)
但是这会产生随机的guid,我希望有顺序的guid.
我可以手动将数据库设置newsequentialid()为默认值,但是没有更好的选择吗?或者EF团队忘记了这个选项?
我正在为我公司正在开始的新数据库制定数据库标准.我们尝试定义的一件事是与UniqueIdentifiers相关的主键和聚簇索引规则.
(注意:我不想讨论使用UniqueIdentifier作为主键或聚簇索引的利弊.网上有大量关于此的信息.这不是讨论.)
所以这是我担心的场景:
假设我有一个带有UniqueIdentifier的表作为聚簇索引和主键.让我们称之为ColA.我将ColA的默认值设置为NewSequentialId().
使用NewSequentialId()我插入三个连续的行:
{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3-440D-A9FE-CC7988DDF067}
然后我重启我的服务器.NewSequentialId的文档说"重新启动Windows后,GUID可以从较低的范围重新开始,但仍然是全局唯一的."
因此下一个起点可能低于前一个范围.
所以重启后,我再插入3个值:
{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016-4645-ABA9-B098D2003E66}
(我不确定guid在数据库中是如何表示的,但我们假设因为这个从3开始,之前的7以7开始,3个比7个小".".
当您执行位于聚簇索引中间的插入时,必须重新映射索引.(至少我的DBA告诉过我.)每次重新启动时,我都冒着将新的UniqueIdentifier范围放在其他先前范围中间的风险.
所以我的问题是:由于下一组UniqueIdentifiers将小于最后一组,每个插入是否会导致我的聚簇索引混乱?
如果没有,为什么?SQL Server是否知道我正在使用NewSequentialId?这有什么补偿吗?
如果没有,那么它如何知道接下来会插入什么?也许接下来的百万次插入将从3开始.或者他们可能从7开始.它是如何知道的?
或者它不知道,只是保持一切顺序.如果是这种情况,则一次重启会严重影响性能.(这让我觉得我需要自己的自定义NewSequentialId,它不会受到重启的影响.)这是正确的吗?还是有一些我不知道的魔法?
编辑:我的标准强烈建议不要将GUID作为聚簇索引.正如我上面所说,有很多原因,这是一个坏主意.我试图找出这是否是另一个原因.
sql-server uniqueidentifier clustered-index sql-server-2008 newsequentialid
我正在做一些研究,我遇到了一个我无法解释的异常(我在Google上找不到任何东西).考虑以下SQL:
CREATE TABLE MyGuid (
ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID()
)
GO
CREATE TABLE MyGuidSeq (
ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID()
)
GO
DECLARE @i INT, @noRecords INT
SET @noRecords = 1000000
-- MyGuid
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuid DEFAULT VALUES
SET @i = @i + 1
END
-- MyGuidSeq
SET @i = 1
WHILE (@i <= @noRecords)
BEGIN
INSERT INTO MyGuidSeq DEFAULT VALUES
SET @i = @i + 1
END …Run Code Online (Sandbox Code Playgroud) 顺序GUID是唯一的,但是是通过订单创建的; 该顺序略有异常,与使用标准.NET Guid比较器时获得的顺序不同.
我正在寻找一个C#Guid比较器,它将根据顺序GUID的规则进行排序.
==更新==
我特别指的是由SQL Server中的NewSequentialId()创建的顺序GUID,虽然我现在意识到标准的Win32 API调用UuidCreateSequential()使用与SQL Server不同的方案(我假设它们在我写这个问题时是相同的) .
==更新2 ==
petelids给出了以下答案,例如List <System.Data.SqlGuid> .Sort()给出以下序列(使用每个4位位置1的GUID的初始列表)...
01000000-0000-0000-0000-000000000000
10000000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000
00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000
00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0000-0001-0000-000000000000
00000000-0000-0010-0000-000000000000
00000000-0000-0000-0001-000000000000
00000000-0000-0000-0010-000000000000
00000000-0000-0000-0100-000000000000
00000000-0000-0000-1000-000000000000
00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000010
00000000-0000-0000-0000-000000000100
00000000-0000-0000-0000-000000001000
00000000-0000-0000-0000-000000010000
00000000-0000-0000-0000-000000100000
00000000-0000-0000-0000-000001000000
00000000-0000-0000-0000-000010000000
00000000-0000-0000-0000-000100000000
00000000-0000-0000-0000-001000000000
00000000-0000-0000-0000-010000000000
00000000-0000-0000-0000-100000000000
Run Code Online (Sandbox Code Playgroud)
与List <System.Guid>返回的以下顺序相反..Sort()
00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000010
00000000-0000-0000-0000-000000000100
00000000-0000-0000-0000-000000001000
00000000-0000-0000-0000-000000010000
00000000-0000-0000-0000-000000100000
00000000-0000-0000-0000-000001000000
00000000-0000-0000-0000-000010000000
00000000-0000-0000-0000-000100000000
00000000-0000-0000-0000-001000000000
00000000-0000-0000-0000-010000000000
00000000-0000-0000-0000-100000000000
00000000-0000-0000-0001-000000000000
00000000-0000-0000-0010-000000000000
00000000-0000-0000-0100-000000000000
00000000-0000-0000-1000-000000000000
00000000-0000-0001-0000-000000000000
00000000-0000-0010-0000-000000000000
00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000
00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000 …Run Code Online (Sandbox Code Playgroud) 目前,我们有许多表在主键上使用 newid() 。这导致了大量的碎片。所以我想更改该列以使用 newsequentialid() 代替。
我认为现有数据仍将保持相当分散,但新数据的分散程度将减少。这意味着我也许应该等待一段时间,然后再将 PK 索引从非聚集更改为聚集。
我的问题是,有人有这样做的经验吗?有什么是我忽略的、应该注意的吗?
根据微软的文档NEWSEQUENTIALID,NEWSEQUENTIALID的输出是可预测的.但可预测的可预测性如何?假设我有一个生成的GUID,NEWSEQUENTIALID它有多难:
/order?id=842告诉我应用程序中有842个订单.以下是关于我正在做什么以及各种权衡取舍的背景信息.
使用GUID比整数作为主键的一个安全好处是GUID很难猜到.例如,黑客看到/user?id=845他可能尝试访问的URL /user?id=0,因为数据库中的第一个用户很可能是管理用户.此外,黑客可以迭代/user?id=0..1..2以快速收集所有用户.
同样,整数的隐私缺点是它们泄露信息./order?id=482告诉我,网上商店自实施以来已经有482个订单.
不幸的是,使用GUID作为主键具有众所周知的性能缺点.为此,SQL Server引入了该NEWSEQUENTIALID功能.在这个问题中,我想了解输出的可预测性NEWSEQUENTIALID.
我有一个包含一长串别名值的表,如下所示:
> head(transmission9, 50)
# A tibble: 50 x 2
In_Node End_Node
<chr> <chr>
1 c4ca4238 2838023a
2 c4ca4238 d82c8d16
3 c4ca4238 a684ecee
4 c4ca4238 fc490ca4
5 28dd2c79 c4ca4238
6 f899139d 3def184a
Run Code Online (Sandbox Code Playgroud)
我想让 R 遍历两列并按顺序为每个值分配一个数字,按照别名值出现在数据集中的顺序。我希望 R 首先跨行读取,然后向下读取列。例如,对于上面的数据集:
In_Node End_Node
<chr> <chr>
1 1 2
2 1 3
3 1 4
4 1 5
5 6 1
6 7 8
Run Code Online (Sandbox Code Playgroud)
这可能吗?理想情况下,我也希望能够生成一个“密钥”,它将每个顺序代码与每个别名值相匹配,如下所示:
Code Value
1 c4ca4238
2 2838023a
3 d82c8d16
4 a684ecee
5 fc490ca4
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助!
我在我的表中添加了一个新的GUID/Uniqueidentifier列.
ALTER TABLE table_name
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID()
GO
Run Code Online (Sandbox Code Playgroud)
当表中更新记录时,我想更新此列"VersionNumber".所以我创建了一个新的触发器
CREATE TRIGGER [DBO].[TR_TABLE_NAMWE]
ON [DBO].[TABLE_NAME]
AFTER UPDATE
AS
BEGIN
UPDATE TABLE_NAME
SET VERSIONNUMBER=NEWSEQUENTIALID()
FROM TABLE_NAME D
JOIN INSERTED I ON D.ID=I.ID/* some ID which is used to join*/
END
GO
Run Code Online (Sandbox Code Playgroud)
但只是意识到NEWSEQUENTIALID()只能与CREATE TABLE或一起使用ALTER TABLE.我收到了这个错误
The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be …Run Code Online (Sandbox Code Playgroud) 使用顺序guid的目的是使用聚簇索引而不会出现聚簇索引中通常存在的高级碎片(如果它是常规guid),对吗?
sql-server guid clustered-index sql-server-2008 newsequentialid
我有一个C#应用程序,它为我插入表中的每一行生成一个顺序GUID.我希望插入的GUID是顺序的,但有时它们会破坏序列(以块为单位).
例:
这些GUID按插入顺序显示.
为什么这些"顺序"GUID是在如此大的序列中断的情况下创建的?
用于生成顺序GUID的代码:
class NativeMethods
{
[DllImport("rpcrt4.dll", SetLastError = true)]
public static extern int UuidCreateSequential(out Guid guid);
}
public static Guid CreateSequentialGuid()
{
const int RPC_S_OK = 0;
Guid guid;
int result = NativeMethods.UuidCreateSequential(out guid);
if (result == RPC_S_OK)
return guid;
else
return Guid.NewGuid(); //<--In debugging, this statement never runs.
}
Run Code Online (Sandbox Code Playgroud)
循环中使用的代码,用于将新GUID和信息插入表中:
Guid mySequentialGUID = CreateSequentialGuid();
string[] row = { item1,
item2,
item3,
sourceText,
encoding.ToString(),
mySequentialGUID.ToString()
};
var listViewItem = new ListViewItem(row);
myListView.Items.Add(listViewItem);
Run Code Online (Sandbox Code Playgroud)
编辑:请参阅此问题以了解顺序GUID:
newsequentialid ×11
guid ×7
sql-server ×5
c# ×4
newid ×2
sql ×2
alias ×1
dataframe ×1
primary-key ×1
r ×1
sequential ×1
t-sql ×1
triggers ×1