我有下表:
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。">