0

我正在尝试将一列添加到 uniqueidentifier 类型的现有 SQL 表中。该列不能为空,当然也是唯一的。我尝试过这段代码:

ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null

其次是:

ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID

但是,当我创建一个新记录(来自 C#)时,uniqueidentifier 始终全为零(可能为 null。)我可以在 C# 中创建 GUID 并在创建一个可以正常工作的新记录时将其传递给 sql,但我担心可以创建重复的 GUID。根据我的阅读,这似乎是一种极其罕见的情况,但是让任何类型的潜在错误四处飘荡似乎总是不好的做法。请注意,该字段不会是表的 PK。为了教育,欢迎提出建议和意见。

我正在使用带有 MS SQL SERVER 2008 的 C# 4.0 框架

4

4 回答 4

3

抱歉耽搁了,但我很高兴地说我已经解决了这个问题。感谢大家的大力支持。虽然没有人一针见血(顺便说一句,有一些非常好的建议),但 Eldog 在他的评论中提出了 Entity Framework 的表现不佳。多亏了他,我简单地用 Google 搜索了 Entity Framework + GUID 并找到了解决方案。

本文逐步介绍了该问题,并对问题、解决方案和解决问题的步骤进行了很好的解释。我会注意到我决定一步一步地测试一个步骤,而我不必做最后一步。这使我相信部分问题可能已在实体框架的更高版本中得到解决。

我只是在设计视图(不是 xml)中提取了 edmx 文件并将StoreGeneratedPattern属性设置为“Identity”。

再次感谢您的帮助和建议。你是一群了不起的人。

于 2013-07-05T20:21:14.643 回答
2

创建记录时,您的 C# 代码是否尝试传入 CurrentInstanceID?如果是这样,您可以从 INSERT 语句中删除该列吗?

我们使用数字主键来做到这一点。我们的 C# 代码调用存储过程以对我们的记录进行 CRUD 操作。C# 代码在客户端生成一个否定键供自己使用。当它准备好创建记录时,它会将这个键传递给存储过程。

proc 忽略此键并插入其余数据。proc 的输出是 SQL 分配给记录的实际键。最后,C# 代码将新键合并到现有数据中。

于 2013-07-05T15:12:03.773 回答
0

我不会为此使用 GUID。GUID 用于 Windows 中的很多操作,因此这将不是仅在您的应用程序中唯一的标识符,而是在您的操作系统中的唯一标识符。除非这对您的情况有意义,否则我不会使用它。

您可以使用增量值,例如简单的uint. 如果您的表已经有一些数据,您可以编写一个脚本,用新列的增量值填充现有行,并在执行该脚本后将唯一约束添加到您的列。

于 2013-07-05T15:07:27.767 回答
0

在您原来的 Create table 或 alter table 中使用如下内容

create table ScheduleJobs (keyval int, id2 uniqueidentifier not null default newsequentialid())

然后不要在插入中引用该列,并且将添加一个新的 GUID 值

于 2013-07-05T15:10:27.013 回答