Entity Framework один к одному или ноль к себе - PullRequest
1 голос
/ 02 октября 2019

Я чувствую, что это то, о чем я думал раньше, но, кажется, не могу пройти через несколько дней. То, что я хочу, это просто, у данного пользователя может быть несколько отношений с другими пользователями, вложенными в него самого.

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; }
}

Но смешиваться с атрибутами ForeignKey для производного класса, который имеет те же свойства / идентификаторы. Я сделал много поисков, но большинство сообщений связано с ApplicationUser, который имеет отношение один к одному или ноль с другим классом, таким как AddressInfo. Мне нужно, чтобы это был один и тот же вложенный класс с Code First, при котором предпочтение должно отдаваться атрибутам свободно, когда это возможно.

Различные попытки этого дают различные ошибки, слишком много разных сценариев для перечисления различных ошибок.

Спасибо за любые рекомендации!

1 Ответ

1 голос
/ 02 октября 2019

Пожалуйста, прочитайте больше о стратегиях наследования в 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...