2011-12-01 50 views
0

我的SQL表包含一个数据类型为uniqueidentifier的Id列。根据SO上的建议,我已将其设置为默认值(newid())在实体框架中使用GUID时出错

使用实体框架4.2的代码首先,我再映射到我的GUID属性的相关领域中的SQL:

[Key] 
public Guid Id { get; set; } 

但是,每当我尝试插入我收到以下异常的实体:

其中一个主键值的类型与实体中定义的类型不匹配。

参数类型'Edm.Guid'和'Edm.String'与此操作不兼容。

我在这里和Google上找到的唯一解决方案是在我的ID上添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]作为数据注释。这不会改变一件事 - 那么还有什么可能导致这个错误?

在此先感谢。

+0

谢谢@Siva。如果我错了,请纠正我,但我相信这不适用于我的情况,因为我先使用不使用.edmx文件的代码。 – Jonathan

+0

你有没有尝试设置GUID可空即'的GUID?'将有guid.Empty的默认valud({} 00000000-0000-0000-0000-000000000000)和EF可能试图因为它不是插入该值空值。 –

+0

显示导致问题的代码并为您的数据库表创建脚本。 –

回答

-1

尝试的

[Key] 
public string ID {get;set;} 

代替

[Key] 
public Guid ID {get;set;} 
+0

谢谢,但这会导致'从字符串转换为uniqueidentifier时转换失败'错误。 – Jonathan

1

你尝试设置标识StoreGeneratedPattern? 你可以在OnModelCreate方法中做到这一点。

Model.Entity<Foo>().Property(o => o.Id).HasDatabaseGenerationOption(DatabaseGeneratedOption.Identity); 
+0

谢谢。我已将以下内容放入OnModelCreating方法中,但仍存在相同的问题。我使用modelBuilder设置它是否重要? modelBuilder.Entity ().Property(O => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); – Jonathan

+0

是的。使用modelBuilder。 我注意到你有不同的错误,你可以显示导致问题的代码 – Turbot

1

如果您需要性能并且有一个索引,那么使用Guid作为主键是不明智的。 Guids是随机生成的值,因此每次插入新项时,与使用bigint相比,它会导致更多的SQL更新索引(它必须每次插入到索引的不同部分而不是始终追加到最后)。如果你需要一个唯一的标识符(如链接跨系统的项目,不共享同一个数据库),然后简单地将其添加为表上的附加列(如果你是偏执狂,并愿以PERF击中插入/更新,你可以额外添加一个唯一的约束)。