Один-к-одному или ноль Entity Framework Fluent API - PullRequest
0 голосов
/ 07 сентября 2018

Я использую Fluent API для создания отношения один-к-одному или нуля, и в первом случае Менеджер - ContactDetails работает, но во втором случае представитель - ContactDetails это не работает Но конфигурация такая же.

Насколько я понимаю, в отношениях один к одному / нулю один из двух классов должен определять ключ как primary и foreignKey, чтобы было известно, какой класс является зависимым. И, например, идентификатор в ContactDetails не может быть ForeignKey для таблицы представителя и менеджера одновременно? Вот почему Представитель_Id создается автоматически? Но почему это отношение считается одним ко многим?

enter image description here

Управляющий класс:

  [Table("Manager")]
public class Manager
{
    [Key]
    [ForeignKey("ApplicationUser")]
    public string Id { get; set; }
    [Required]
    [MaxLength(100)]
    public string Name { get; set; }
    public virtual ContactDetail ContactDetail { get; set; }
    [JsonIgnore]
    public virtual ICollection<Client> Clients { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

Представительский класс:

[Table("Representative")]
public class Representative
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(99)]
    public string Name { get; set; }
    [Required]
    public int ClientId { get; set; }
    [JsonIgnore]
    public virtual Client Client{ get; set; }
   public virtual ContactDetail ContactDetail {get; set; }
}

Класс ContactDetail:

    public class ContactDetail
{
    [Key]
    public string Id { get; set; }

    [Required]
    [MaxLength(100)]
    public string FirstName { get; set; }
    [MaxLength(100)]
    public string SecondName { get; set; }
    [MaxLength(100)]
    public string LastName { get; set; }

    [JsonIgnore]
    public virtual Manager Manager { get; set; }

    [JsonIgnore]
   public virtual Representative Representative { get; set; }
}

Метод переопределения в контексте:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

           modelBuilder.Entity<Manager>()
               .HasOptional(m => m.ContactDetail)
               .WithRequired(ad => ad.Manager);

          modelBuilder.Entity<Representative>()
               .HasOptional(c => c.ContactDetail)
               .WithRequired(ad => ad.Representative);

        base.OnModelCreating(modelBuilder);
    }
...