避免桌面应用程序 (WPF) Entity framework 中的重复 Guid

Avoiding duplicate Guid in Entity framework for Desktop Apps (WPF)

我有以下 table:

CREATE TABLE [dbo].[Table1](
    Table1ID [uniqueidentifier] NOT NULL,
    Name [varchar](200) NOT NULL,
    [Date] [smalldatetime] NOT NULL,
 CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
    [Table1ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],

) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Table1] ADD  CONSTRAINT [DF_Table1_Table1ID]  DEFAULT (newid()) FOR [Table1ID]
GO

当我首先使用数据库将它映射到 EF 6.1.3 时,一切都很好,生成了一个实体 Table1s,其 Table1ID 类型为 Guid

当我使用 EF 向数据库中插入新项目时,我不能将 Table1ID 字段留空,我必须执行以下操作:

var newRecord = new Table1();
newRecord.Table1ID = Guid.NewGuid();
newRecord.Name = "Test"
newRecord.Date = DateTime.Now;

Manager.Entities.Table1s.Add(newRecord);
Manager.Entities.SaveChanges();

这是从桌面应用程序 (WPF) 发送的,并且会有多个客户端(应用程序将在网络周围的几台 PC 中,都连接到同一个数据库)。

当我创建 Guid.NewGuid() 时,Guid 在客户端本地生成,然后在我创建 SaveChanges() 时发送到数据库。

这是否意味着在某些时候 Guid 被复制了? (Guid.NewGuid 将生成数据库中已有的 Guid)。

如果发生这种情况,是否有其他方法可以在创建记录之前从数据库生成 Guid?

我尝试添加一个空的 Guid,但这没有帮助。

我发现了如下相关问题:

但似乎每个人都使用在服务器中开发的应用程序(例如 ASP.net 应用程序),这些应用程序没有问题,因为所有 Guid.NewGuid() 都是在服务器中生成的。

它可能会生成重复项,但机会很小,您不应该在意它。在 wiki 上有关于它的文章 https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions 。 "This number is equivalent to generating 1 billion UUIDs per second for about 85 years, and a file containing this many UUIDs, at 16 bytes per UUID, would be about 45 exabytes, many times larger than the largest databases currently in existence, which are on the order of hundreds of petabytes."

Doesn't this mean that at some point there is a change for the Guid to be duplicated?

可以生成重复的 guid,但不太可能。重复它们的可能性非常低:

What are the chances to get a Guid.NewGuid () duplicate?

If this could happen, is there a different way to generate a Guid from the database before creating the record?

例如,您可以使用自动递增的主键在数据库中生成身份:

How do I add a auto_increment primary key in SQL Server database?

但是在客户端生成 guid 应该也能正常工作。