避免桌面应用程序实体框架(WPF)中的重复Guid



我有下表:

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

当我首先使用Database将其映射到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中,所有PC都连接到同一个DB)。

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

这难道不意味着在某个时刻,Guid会发生更改以进行复制吗?(Guid.NewGuid将生成一个已在数据库中的Guid)。

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

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

我发现了如下相关问题:

  • 使用GUID和实体框架
  • 可为Null的GUID
  • 从数据库获取Guid

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

这难道不意味着在某个时刻会对要复制的Guid进行更改吗?

可能生成重复的guid,但不太可能。得到重复的可能性非常低:

获得Guid.NewGuid()副本的机会有多大?

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

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

如何在SQL Server数据库中添加auto_increment主键?

但是在客户端生成guid也应该很好。

它可能会产生重复,但可能性很小,你不应该关心它https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions。"这个数字相当于在大约85年的时间里每秒生成10亿个UUID,而一个包含这么多UUID的文件,每个UUID 16字节,大约是45 EB,比目前最大的数据库大很多倍,后者大约有数百PB。">

最新更新