EF使用HasOne配置关联时报Guid需为引用类型错误如何解决?
报错原因
HasOne<T>是EF Core用于配置实体间引用导航属性的方法,泛型参数要求必须是引用类型的实体类,你传入的AuthorID是Guid值类型,只是外键存储字段,不属于实体导航属性,因此触发类型校验报错。
你之前写的builder.HasOne(u => u.Author)是符合要求的写法,Author属于BaseWriter实体类型,对应关联的作者对象,无需单独给AuthorID字段调用HasOne。
实现方案
1. 正确配置作者关联与外键
你需要把导航属性Author和外键字段AuthorID绑定配置即可,完整关联配置如下:
builder.HasOne(u => u.Author) // 关联BaseWriter里的文章集合导航属性 .WithMany(a => a.AllArticles) // 指定外键存储字段为AuthorID .HasForeignKey(u => u.AuthorID) // 可根据需求调整删除行为,比如Restrict禁止级联删除 .OnDelete(DeleteBehavior.Cascade);
2. 配置联合主键
首先需要先给ArticleEntity类补充你要用作联合主键的两个属性:
// 在ArticleEntity类中新增以下两个属性 public Guid UserID { get; set; } public string UserName { get; set; }
然后修改Configure方法里的主键配置,用匿名类传入多个属性即可配置联合主键:
// 替换原来的builder.HasKey(u => u.ArticleID); builder.HasKey(u => new { u.UserID, u.UserName });
完整正确的配置代码
public class ArticleMap : IEntityTypeConfiguration<ArticleEntity> { public void Configure(EntityTypeBuilder<ArticleEntity> builder) { builder.ToTable("Article"); // 配置联合主键 builder.HasKey(u => new { u.UserID, u.UserName }); // 配置作者关联 builder.HasOne(u => u.Author) .WithMany(a => a.AllArticles) .HasForeignKey(u => u.AuthorID); // 可选:配置审核人、删除人关联 builder.HasOne(u => u.ApprovedBy).WithMany().HasForeignKey("ApprovedById"); builder.HasOne(u => u.DeletedBy).WithMany().HasForeignKey("DeletedById"); } }
内容的提问来源于stack exchange,提问作者Fernando Ferreira
相关产品推荐
相关产品推荐

