将GUID与Entity Framework一起使用时出错

时间:2011-12-01 00:51:32

标签: c# sql entity-framework ef-code-first

我的SQL表包含Id列,其数据类型为uniqueidentifier。根据SO上的建议,我将其设置为默认值(newid())

首先使用Entity Framework 4.2代码,然后我将我的Guid属性映射到SQL中的相关字段:

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

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

  

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

     

参数类型'Edm.Guid'和'Edm.String'与此操作不兼容。在WHERE谓词附近,第1行,第61列。

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

提前致谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果您需要性能并且有一个索引,那么使用Guid作为主键是不明智的。 Guids是使用随机值生成的,因此每次插入新项时,与使用bigint相比,SQL会更多地更新索引(每次都必须插入索引的不同部分而不是总是追加到最后)。如果你需要一个唯一的标识符(比如在不共享相同数据库的系统之间链接项目),那么只需将其作为附加列添加到表中(如果你是偏执的并且愿意在插入/上采取perf命中/更新,你可以另外添加一个唯一约束)。

答案 2 :(得分:-1)

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

而不是

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