c# - 实体框架一对一或零对自身
问题描述
我觉得这是我以前想过的事情,但现在似乎无法过去几天。我所追求的很简单,一个给定的用户可能与嵌套在自身内部的其他用户有多个关系。
public class ApplicationUser : IdentityUser
{
public virtual ApplicationUser Approver { get; set; }
public virtual ApplicationUser Provider { get; set; }
}
没有得到关于哪一端是主要和依赖等的错误。给定的用户可能没有批准者,或者他们可能。
我觉得制作派生类有些东西:
public class Provider: ApplicationUser
{
public virtual List<ApplicationUser> Clients{ get; set; }
}
这将使 ApplicationUser 像这样:
public class ApplicationUser : IdentityUser
{
public virtual Approver Approver { get; set; }
public virtual ProviderProvider { get; set; }
}
和
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Provider> Providers { get; set; }
public DbSet<Approver> Approvers { get; set; }
}
但是与共享相同属性/ID的派生类的ForeignKey属性混淆。我进行了很多搜索,但大多数帖子都与 ApplicationUser 相关,该 ApplicationUser 与另一个类(例如 AddressInfo)具有一对一或零关系。我需要它是与 Code First 相同的嵌套类,尽可能使用流利的属性。
对此的不同尝试提供了各种不同的错误,太多不同的场景无法列出各种错误。
感谢您的任何建议!
解决方案
请阅读更多关于 EF 中的继承策略,例如这里。
如果您只想在您的用户之间添加关系并且所有用户都将具有相同的属性,那么您不需要使用任何继承,但您需要帮助 EF 了解您在做什么:
public class ApplicationUser
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ApplicationUser Provider { get; set; }
public virtual List<ApplicationUser> Clients { get; set; }
public virtual ApplicationUser Approver { get; set; }
public virtual List<ApplicationUser> Candidates { get; set; }
}
public class ApplicationDbContext : DbContext
{
public DbSet<ApplicationUser> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().HasOptional(e => e.Approver).WithMany(e=>e.Candidates);
modelBuilder.Entity<ApplicationUser>().HasOptional(e => e.Provider).WithMany(e =>e.Clients);
}
}
推荐阅读
- blogger - 如何编辑博客 HTML 以在移动主题中显示默认搜索框?
- javascript - Popper popovers 没有正确遵循旋转的 popper 参考
- javascript - d3 v4 地图意外变空
- git - 我无法在 Digital Ocean 上进行远程部署
- java - 为什么数据文件中的count值不递增?
- geolocation - Json 文件未加载到 folium 地图上
- matlab - 取矩阵列的平均值
- r - R 中 gtools::mixedsort 包的奇怪行为
- javascript - 使用 Google Chart API 在堆积条形图中使用符号注释
- python - 下拉列表更改时将值传递给烧瓶路线