【问题标题】:Error when using GUID with Entity Framework将 GUID 与实体框架一起使用时出错
【发布时间】:2011-12-01 00:51:32
【问题描述】:

My 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 上都能找到的唯一解决方案是在我的 ID 上添加 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 作为数据注释。这不会改变任何事情 - 那么还有什么可能导致此错误?

提前致谢。

【问题讨论】:

  • 谢谢@Siva。如果我错了,请纠正我,但我相信这不适用于我的情况,因为我首先使用不使用 .edmx 文件的代码。
  • 您是否尝试将 guid 设置为可为空,即 guid? 它将具有默认值 guid.Empty ({00000000-0000-0000-0000-000000000000}) 并且 EF 可能正在尝试插入这个值不为空。
  • 显示导致问题的代码并为您的数据库表创建脚本。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我在我的 OnModelCreating 方法中添加了以下内容,但我仍然遇到同样的问题。我使用模型构建器设置它有关系吗? modelBuilder.Entity().Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
  • 是的。使用模型构建器。我注意到你有不同的错误,你能显示导致问题的代码吗
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多