如何搭建用户与地址模型,实现通过邮编关联加载对应城市数据?
解决方案
第一步:修改ApplicationUser模型,添加City导航属性
public class ApplicationUser : IdentityUser<Guid> { public string FirstName { get; set; } public string LastName { get; set; } public string PostAddress { get; set; } // 街道、转交地址、门牌号等 public string Zip { get; set; } // 新增City导航属性 public City City { get; set; } // 更多属性... } public class City { public Guid Id { get; set; } public string Zip { get; set; } public string Name { get; set; } }
第二步:在DbContext的OnModelCreating方法中配置关联关系
由于我们需要用非主键的Zip字段作为两张表的关联依据,需要通过Fluent API显式指定关联规则,同时为City的Zip字段加唯一索引避免数据冗余导致关联异常:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置User和City的关联关系 modelBuilder.Entity<ApplicationUser>() .HasOne<City>(u => u.City) .WithMany() // 如果City需要关联回用户集合,可以在City类添加public List<ApplicationUser> Users { get; set; },再改成.WithMany(c => c.Users) .HasForeignKey(u => u.Zip) .HasPrincipalKey(c => c.Zip) // 指定主表City用来关联的键是Zip,而非主键Id .OnDelete(DeleteBehavior.Restrict); // 禁止删除城市时级联删除关联用户,可根据业务需求调整 // 给City的Zip加唯一索引,保证一个邮编仅对应一条城市记录 modelBuilder.Entity<City>() .HasIndex(c => c.Zip) .IsUnique(); }
效果验证
完成以上配置后,你期望的查询语句就可以直接正常执行:
var User = await db.Users.Where(u => u.Id == id) .Include(c => c.City) .FirstOrDefaultAsync();
注意事项
该方案完全符合你不使用邮编作为主键的设计要求,后续如果邮编对应城市规则变更,仅需要修改City表的对应记录即可,无需改动用户表的任何数据。
内容的提问来源于stack exchange,提问作者Stian
相关产品推荐
相关产品推荐

