EF 核心关系映射

时间:2021-01-27 12:28:10

标签: c# asp.net-core entity-framework-core mapping relationship

在项目中,我可以有一个 User 可以有多个 UserActivites。在我的模型中,我将它们的关系设置如下:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public string Email { get; set; }

    //relationship mapping example
    // delete these attributes and you'll cause a self referenceing loop error
    [JsonIgnore] 
    [IgnoreDataMember]
    public List<UserActivity> Activities { get; set; }
}


public class UserActivity
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Project { get; set; }
    public DateTime EntryDate { get; set; }
    
    // relationship mapping
    public User User { get; set; }
}

在我的存储库类中,我以这种方式获取所有用户活动:

public async Task<IEnumerable<UserActivity>> GetAll()
{
    var result = await _context.UserActivities.Include(activity => activity.User).OrderByDescending(x => x.EntryDate).ToListAsync();
    return result;
}

但是,当我运行我的项目时,UserUserActivities 属性为空。因此,我查看了有关 EF Core 关系的 Microsoft 文档,并在我的上下文中更新了我的 OnModelCreating 方法,以进行如下映射:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<UserActivity>().ToTable("UserActivities").Property(x => x.Id).ValueGeneratedOnAdd();
    modelBuilder.Entity<UserActivity>().ToTable("UserActivities").HasOne(x => x.User).WithMany();

    modelBuilder.Entity<User>().ToTable("Users").Property(x => x.Id).ValueGeneratedOnAdd();
    
    base.OnModelCreating(modelBuilder);
}

但是,当我再次运行该项目时,我的 User 属性仍未填充。我知道这不是数据问题,因为我的 User 表中有数据并将其显示在单独的页面上。

我不确定我做错了什么/遗漏了什么。所以任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

试试这个代码:

你的桌子:

  public partial class User
    {
        public User()
        {
            UserActivities = new HashSet<UserActivity>();
        }

        [Key]
        public int Id { get; set; } 
        [Required]
        public string UserName { get; set; }
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
        public string Email { get; set; }
     

        [InverseProperty(nameof(UserActivity.User))]
        public virtual ICollection<UserActivity> UserActivities { get; set; }
    }

public partial class UserActivity
    {
        [Key]
        public int Id { get; set; }
        public int UserId { get; set; }
        public string Project { get; set; }
        public DateTime EntryDate { get; set; }

        [ForeignKey(nameof(UserId))]
        [InverseProperty("UserActivity")]
        public virtual User User { get; set; }
    }

数据库上下文:


protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            
            modelBuilder.Entity<UserActivity>(entity =>
            {
                entity.HasOne(d => d.User)
                    .WithMany(p => p.UserActivities)
                    .HasForeignKey(d => d.UserId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_UserActivity_User");
            });

            OnModelCreatingPartial(modelBuilder);
        }