使用Entity Framework和uniqueidentifier SQL列类型

5
在我们的客户表中,我使用一个默认值为newsequentialid()的uniqueidentifier列作为主键和identity。通过管理工具插入新行可以正常创建ID值。
但是,通过EF从.NET 4代码插入会导致插入零GUID(00000-0000....)。我使用new创建实体,设置一些值并执行EF的AddToClients操作(例如)。如果进行调试,id属性的值显示为零GUID。我没有在我的代码中显式设置id,因为我想让它由SQL Server中的newsequentialid()来处理。问题是,它不起作用。第一次执行代码时,行被插入零GUID。下一次它显然会失败,并导致主键违规异常。
如何在不必在客户端代码中设置GUID的情况下使其正常工作?
3个回答

12
您需要更改EF设计器中属性的StoreGeneratedPattern值。将其设置为Identity。这将使EF避免在插入时设置该值,然后在插入完成后捕获它。
请注意,如果您正在使用EF 4,仅使用设计器可能会有问题(请参见此链接)。您可能需要手动编辑.edmx并在存储模型本身中设置StoreGeneratedPattern

完成了。没有改变。实体在插入之前仍然没有设置零GUID,插入失败并出现重复键(我将先前插入的留在表中)。 - mare
哦,我明白了关于设计师的问题...这真是太好了..除了另一个问题,在另一个问题中我写到了,现在又出现了这个。不过还是谢谢你的答案。 - mare
@mare:我感同身受。EF 是一个强大的工具,但当你遇到它处理不好的东西时,绕过它可能会是一个巨大的头痛。 - Adam Robinson
“巨大”绝对是正确的词,因为这是一个非常痛苦的问题,只需阅读此文章http://geeksharp.com/2010/05/27/ef4-bug-in-storegeneratedpattern-ssdl/即可知道。 - mare
@AdamRobinson 非常感谢您的回答。我也遇到了同样的问题,但是很快就解决了。 - Guillaume Raymond
@AdamRobinson,每当我更新列的StoreGeneratedPattern属性为"Identity",然后运行程序并执行dbContext.SaveChanges()时,就会出现以下错误:======>存储更新、插入或删除语句影响了意外数量的行 (0)。实体可能已经被修改或删除,因为实体已加载。请刷新ObjectStateManager条目。 - Mahesh

0

我也遇到了同样的问题,真是让人头疼。这里有一个页面,包含微软的评论 - http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/aecf14e3-e4c9-439b-88af-23d4353afb9d

我的解决方法是创建一个存储过程来进行插入操作。这个页面提供了一些关于如何实现这个功能的信息 - http://thedatafarm.com/LearnEntityFramework/tutorials/using-stored-procedures-for-insert-update-amp-delete-in-an-entity-data-model/。目前我只有一个插入存储过程,没有更新或删除;与文章相反,我没有收到模型验证错误。

更正 EF 让我做到了检索实体列表,但是当我尝试获取特定实体的实例时,出现了有关缺少更新映射函数的错误。唉!

为了检索使用 newsequentialid() 生成的插入 UUID,我使用了在 SQL Server 2005 中引入的“OUTPUT INSERTED.[column]”技术。一个例子在 Retrieve last row inserted with Uniqueidentifier that it is not IDENTITY。我在插入存储过程中使用相同的技术来检索设置默认 getdate() 的日期时间列。

希望能对某些人有所帮助,

唐尼


为了解决这个问题,我在我的代码中使用了Guid.NewGuid()函数,因此在插入新实体之前,我只需生成一个GUID。虽然它不是按顺序的,但它可以正常工作,并且在EF未来版本更改时仍将继续工作。对于记录数较少的表,性能影响应该很小。 - mare

0

在你的 .edmx 文件上右键,选择用编码或其他 XML 文本编辑器打开。 找到 id 名称,在同一个标签中添加属性:StoreGeneratedPattern="Identity"。

示例:

< Property Name="WorkerId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" />


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接