0

J'ai l'entité Programme qui a deux clés étrangères à ma table de sujet (MainContactSubjectId, SecondaryContactSubjectId). Les deux principaux et secondaires sont nullables. Pour une raison quelconque, lorsque j'essaie d'insérer une entité, je programme les erreurs (Internal Server Error) et ne me laisse pas insérer sauf Main et Secondaire. Voici mon programme d'entité et certains de mes dbContext. Quelqu'un peut-il voir ce que je fais mal? Je suppose que le problème est ici mais je ne suis pas sûr de ce que c'est. Mon meilleur est le .HasRequired mais je ne suis pas sûr de savoir comment le réécrire. Sans ce code, les clés étrangères ne sont pas créées correctement et les problèmes de référence circulaire. Le WillCascadeOnDelete (false) arrête le problème de référence circulaire .Code d'abord - champ non obligatoire est requis

public virtual IDbSet<AppTables.Programs.Program> Programs { get; set; } 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
      modelBuilder.Entity<AppTables.Programs.Program>() 
        .HasRequired(m => m.MainSubject) 
        .WithMany(t => t.ProgramsMain) 
        .HasForeignKey(m => m.MainContactSubjectId) 
        .WillCascadeOnDelete(false); 

      modelBuilder.Entity<AppTables.Programs.Program>() 
        .HasRequired(m => m.SecondarySubject) 
        .WithMany(t => t.ProgramsSecondary) 
        .HasForeignKey(m => m.SecondaryContactSubjectId) 
        .WillCascadeOnDelete(false); 
    } 

Edit 1: Je suis assez confiant mon problème est dans la couche d'accès aux données, mais sinon, je fais un appel ajax directement à ma couche Application Service « Créer ». En passant, tout semble parfait. Il frappe le retour, puis je reçois Erreur interne du serveur. Pas d'autres détails. J'ai essayé d'emballer dans try/catch et catch n'est jamais touché. J'utilise le framework Asp.net Boilerplate. J'ai aussi posté dans leur forum privé sans aucune chance. J'ai juste supposé que c'était un problème de couche d'accès aux données, c'est pourquoi j'ai posté ici.

public async Task<> Create(ProgramInput model) 
    { 
      Program domainModel = new Program(); 
      domainModel.TenantId = (int)AbpSession.TenantId; 
      domainModel.ProgramName = model.ProgramName; 
      domainModel.ProgramTypeId = model.ProgramTypeId; 
      domainModel.MainContactSubjectId = model.MainContactId; 
      domainModel.SecondaryContactSubjectId = model.SecondaryContactId; 
      domainModel.CreatedBy = (long)AbpSession.UserId.Value; 
      domainModel.CreatedDate = Clock.Now; 
      domainModel.IsDeleted = false; 

      await _programRepository.InsertAsync(domainModel); 

      return; 
    } 

Edit 2: Voici ma table Objet. Il a 50 colonnes et 10 clés étrangères mais je vais raccourcir avec juste les données pertinentes.

public class Subject : Entity<long> 
{ 
    public Subject() 
    { 
     this.ProgramsMain = new HashSet<AppTables.Programs.Program>(); 
     this.ProgramsSecondary = new HashSet<AppTables.Programs.Program>(); 
    } 

    [Required] 
    public int TenantId { get; set; } 

    [Required] 
    public long SubjectTypeId { get; set; } 

    [MaxLength(1000)] 
    public string FirstName { get; set; } 

    [MaxLength(1000)] 
    public string MiddleName { get; set; } 

    [MaxLength(1000)] 
    public string LastName { get; set; } 

    [MaxLength(100)] 
    public string Suffix { get; set; } 

    [MaxLength(3000)] 
    public string FullName { get; set; } 
//A TON MORE COLUMNS .... 




    public virtual AppTables.SubjectTypes.SubjectType SubjectType { get; set; } 
    public virtual ICollection<AppTables.Programs.Program> ProgramsMain { get; set; } 
    public virtual ICollection<AppTables.Programs.Program> ProgramsSecondary { get; set; } 

RÉPONSE Je compris ma réponse. J'ai changé .HasRequired à .HasOptional et tout fonctionne maintenant. Désolé d'avoir perdu le temps de tout le monde. Merci!

+0

Etes-vous sûr que l'erreur est dans la couche d'accès aux données? Qu'en est-il de votre contrôleur? Veuillez spécifier plus d'informations sur le canal qui dirige les données à insérer. – Emad

+0

À quoi ressemble ProgrammesMain et ProgramsSecondary? – Bit

+1

J'ai compris ma réponse. J'ai changé .HasRequired à .HasOptional et tout fonctionne maintenant. Désolé d'avoir perdu le temps de tout le monde. Merci! – Ben

Répondre

0

De la réponse dans son édition de la question de l'OP et commentaires:

Changement .HasRequired à .HasOptional selon le code ci-dessous. Etes-vous sûr que l'erreur est dans la couche d'accès aux données?

public virtual IDbSet<AppTables.Programs.Program> Programs { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<AppTables.Programs.Program>() 
       .HasOptional(m => m.MainSubject) 
       .WithMany(t => t.ProgramsMain) 
       .HasForeignKey(m => m.MainContactSubjectId) 
       .WillCascadeOnDelete(false); 

     modelBuilder.Entity<AppTables.Programs.Program>() 
       .HasOptional(m => m.SecondarySubject) 
       .WithMany(t => t.ProgramsSecondary) 
       .HasForeignKey(m => m.SecondaryContactSubjectId) 
       .WillCascadeOnDelete(false); 
}