【问题标题】:Entity Framework One to One or Zero to Itself实体框架一对一或零对自身
【发布时间】:2020-01-31 07:12:11
【问题描述】:

我觉得这是我以前想过的事情,但现在似乎无法过去几天。 我所追求的很简单,一个给定的用户可能与嵌套在自己内部的其他用户有多个关系。

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 相同的嵌套类,尽可能使用流畅的属性。

对此的不同尝试提供了各种不同的错误,不同的场景太多,无法列出各种错误。

感谢您的任何建议!

【问题讨论】:

    标签: c# asp.net .net entity-framework ef-code-first


    【解决方案1】:

    请阅读更多关于 EF 中的继承策略,例如 here

    如果您只想在您的用户之间添加关系并且所有用户将具有相同的属性,那么您不需要使用任何继承,但您需要帮助 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);
            }
        }
    

    【讨论】:

    • 好的,Providers 和 Approvers 之间没有关系。一个用户可以有一个Provider,一个用户可以有一个Approver。那么在这种情况下,你的 WithMany() 会发生什么?这只是许多应用程序用户。这就是让它变得困难的原因,就好像它在这两个导航属性之间我会拥有它。
    • 在我的示例中,所有集合都是可选的。如果您不需要查找用户可以批准的所有用户(候选人)或提供的用户(客户),您可以将它们从模型中删除,将 WithMany() 替换为 WithOptionalPrincipal()WithOptionalDependent() 取决于您需要什么.
    • @StevenEdison,请详细说明您的域模型和访问模式。我想我不太明白你对拥有 2 个导航属性的担忧。
    • 我错过了你的意思错误得到了它,我看到了同一个班级的客户提供者和候选人批准者的工作,这很完美。谢谢!
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多