如何在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
相关产品推荐
相关产品推荐

