但是,通过EF从.NET 4代码插入会导致插入零GUID(00000-0000....)。我使用new创建实体,设置一些值并执行EF的AddToClients操作(例如)。如果进行调试,id属性的值显示为零GUID。我没有在我的代码中显式设置id,因为我想让它由SQL Server中的newsequentialid()来处理。问题是,它不起作用。第一次执行代码时,行被插入零GUID。下一次它显然会失败,并导致主键违规异常。
如何在不必在客户端代码中设置GUID的情况下使其正常工作?
StoreGeneratedPattern
值。将其设置为Identity
。这将使EF避免在插入时设置该值,然后在插入完成后捕获它。StoreGeneratedPattern
。我也遇到了同样的问题,真是让人头疼。这里有一个页面,包含微软的评论 - 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() 的日期时间列。
希望能对某些人有所帮助,
唐尼
在你的 .edmx 文件上右键,选择用编码或其他 XML 文本编辑器打开。 找到 id 名称,在同一个标签中添加属性:StoreGeneratedPattern="Identity"。
示例:
< Property Name="WorkerId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" />