EF Core报错实体类型Uri需定义主键,引用公共模型无法改属性怎么办?
解决EF Core中System.Uri属性报“实体类型‘Uri’需要定义主键”的问题
这个问题我碰到过不少次,EF Core默认会把非字符串的引用类型当作实体来处理,所以它会试图给System.Uri生成映射,但Uri本身没有EF能识别的主键,就报了这个错。解决方法很简单,只需要告诉EF把Uri当成值类型来处理,用**值转换器(Value Converter)**将其与字符串互相转换即可:
方法一:为单个实体的Uri属性配置转换器
在你的DbContext的OnModelCreating方法里,针对Message实体的Uri属性添加转换规则:
public DbSet<Message> Messages { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Message>() .Property(m => m.Uri) .HasConversion( // 写入数据库时:Uri转字符串 uri => uri?.ToString(), // 从数据库读取时:字符串转Uri str => string.IsNullOrEmpty(str) ? null : new Uri(str) ); }
这段代码会让EF Core把Uri存储为数据库里的字符串字段,读取时再转换回Uri对象,完全不会把Uri当作需要主键的实体来处理。
方法二:全局配置Uri转换器(推荐)
如果你的项目里有多个实体用到了Uri属性,可以全局配置转换器,避免重复代码:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties<Uri>() .HaveConversion( uri => uri?.ToString(), str => string.IsNullOrEmpty(str) ? null : new Uri(str) ); }
这样所有实体中的Uri属性都会自动应用这个转换规则,不用逐个配置。
注意事项
- 如果你的Uri可能为null,转换器里一定要加空值判断,避免出现
ArgumentNullException - 确保存储的Uri字符串格式合法,否则读取时会抛出
UriFormatException,必要时可以在转换逻辑里添加格式校验
内容的提问来源于stack exchange,提问作者Khaine775
相关产品推荐
相关产品推荐

