如何使用Fluent API配置AppUser与Sale表的一对多关联关系
EF Core Fluent API 配置AppUser与Sale一对多关系方案
1 调整实体类属性
因为IdentityUser默认主键Id为string类型,外键类型需要与主键保持一致,同时补充导航属性简化关联操作:
修改后的AppUser类
using System.Collections.Generic; using Microsoft.AspNetCore.Identity; namespace Domain { public class AppUser : IdentityUser { public string DisplayName { get; set; } public string Bio { get; set; } // 新增导航属性:一个用户对应多条销售记录 public ICollection<Sale> Sales { get; set; } = new List<Sale>(); } }
修改后的Sale类
namespace Domain { public class Sale { public int SaleID { get; set; } public int SaleAmount { get; set; } // 调整外键类型和AppUser主键Id保持一致,若你自定义Identity主键为int则不用改 public string UserID { get; set; } // 新增导航属性:一条销售记录对应一个用户 public AppUser AppUser { get; set; } } }
2 DataContext中添加Fluent API配置
在你的DataContext类的OnModelCreating方法中添加如下配置即可完成关联:
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Domain; namespace YourNamespace { // 注意DataContext要继承IdentityDbContext<AppUser>而不是普通的DbContext public class DataContext : IdentityDbContext<AppUser> { public DataContext(DbContextOptions<DataContext> options) : base(options) { } // 声明DbSet public DbSet<Sale> Sales { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 必须先调用父类的OnModelCreating,否则Identity相关配置会失效 base.OnModelCreating(modelBuilder); // 配置一对多关系 modelBuilder.Entity<Sale>() // 一条Sale对应一个AppUser .HasOne<AppUser>(s => s.AppUser) // 一个AppUser对应多条Sale .WithMany(u => u.Sales) // 指定Sale的外键为UserID .HasForeignKey(s => s.UserID) // 指定关联AppUser的主键Id,这里可以省略,默认会关联主键,写上更清晰 .HasPrincipalKey(u => u.Id) // 配置删除行为,可根据业务需求调整,比如Restrict表示删除用户时如果有关联Sale则禁止删除 .OnDelete(DeleteBehavior.Cascade); } } }
补充说明
如果你的项目已经自定义了IdentityUser的主键类型为int,只需要将Sale类的UserID保持为int即可,其余配置逻辑无需修改。
内容的提问来源于stack exchange,提问作者Arifullah irfann
相关产品推荐
相关产品推荐

