You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Compact中通过EF Code First将GUID设为主键?

解决SQL Server Compact 4.0 EF Code First中GUID作为主键的问题

首先明确你的认知是正确的:SQL Server Compact 4.0仅支持int和bigint类型作为服务器端自增(标识)主键,uniqueidentifier类型无法被设置为服务器自动生成的标识列,这就是你使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]时报错的原因。

要实现GUID作为主键,需要调整配置,让主键值由客户端生成而非服务器生成,具体方案如下:

方案1:保留Key特性,配置客户端生成主键

保留[Key]特性标识主键,同时明确告知EF不使用服务器生成值,避免报错:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] // 指定值由客户端提供
public Guid Id { get; set; }

方案2:确保插入时生成唯一GUID

配置完成后,必须保证每次创建新实体时,主键Id都被设置为唯一的GUID值,有两种常用方式:

  • 在实体构造函数中自动初始化:
public class YourEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }

    // 其他实体属性

    public YourEntity()
    {
        // 实例化时自动生成唯一GUID
        Id = Guid.NewGuid();
    }
}
  • 在插入实体前手动赋值:
var newEntity = new YourEntity
{
    Id = Guid.NewGuid(),
    // 其他属性赋值
};
dbContext.YourEntities.Add(newEntity);
dbContext.SaveChanges();

方案3:使用Fluent API配置(推荐)

如果你更倾向于用Fluent API而非数据注解,可以在DbContext的OnModelCreating方法中配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<YourEntity>()
        .HasKey(e => e.Id) // 设置主键
        .Property(e => e.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); // 禁用服务器生成
}

同样需要在实体创建时通过构造函数或手动赋值的方式生成唯一GUID。

为什么移除Key特性会出现重复键?

移除[Key]后,EF无法识别该列为主键,导致数据插入逻辑混乱,甚至可能重复插入默认值(空GUID),从而触发重复键错误,因此必须保留[Key]特性来明确主键。

内容的提问来源于stack exchange,提问作者sadegh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:05:16