c# - EF Core 关系映射
问题描述
在项目中,我可以拥有一个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;
}
但是,当我运行我的项目时,User
属性UserActivities
为空。因此,我检查了有关 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
表格中有数据并将其显示在单独的页面上。
我不确定我做错了什么/错过了什么。所以任何帮助将不胜感激
解决方案
试试这个代码:
你的桌子:
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);
}
推荐阅读
- jquery - 带有悬停效果引导的图像滑块
- c - 如何在没有查找表的情况下将表示编码字符(例如 "0x79" 或 "\n" )的字符串转换为其表示的整数值
- machine-learning - 如果数据中没有季节性但趋势在上方,哪种模型最适合时间序列预测?
- java - 如何在两个节点之间交换数据?(爪哇)
- javascript - Javascript 新手,遇到一些条件问题
- reactjs - React Native 中的 Sqlite 增量数据备份
- r - R中的函数,传入变量
- apache-kafka - KSQL:KSQL 服务器重新启动后丢失 Kstream 数据
- python - 使用子图增加 Python 中的绘图大小
- android - 如何让应用只在特定的 WiFi 上运行