0

私のサブジェクトテーブル(MainContactSubjectId、SecondaryContactSubjectId)に2つの外部キーを持つエンティティプログラムがあります。メインとセカンダリの両方がNULL可能なlongです。なんらかの理由で、エンティティを挿入しようとするとエラーが発生し(内部サーバーエラー)、メインとセカンダリが存在しない限り挿入できません。以下は私のエンティティプログラムと私のdbContextの一部です。誰でも私が間違っていることを見ることができますか?コードファースト - 非必須フィールドが必要です

[Table("Program")] 
    public class Program : Entity<long> 
    { 

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

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

     [Required] 
     [MaxLength(4000)] 
     public string ProgramName { get; set; } 

     public long? MainContactSubjectId { get; set; } 

     public long? SecondaryContactSubjectId { get; set; } 

     public virtual ICollection<AppTables.Case_ProgramRequirements.Case_ProgramRequirement> Case_ProgramRequirement { get; set; } 
     public virtual AppTables.ProgramTypes.ProgramType ProgramType { get; set; } 
     public virtual AppTables.Subjects.Subject MainSubject { get; set; } 
     public virtual AppTables.Subjects.Subject SecondarySubject { get; set; } 
    } 

ここに問題があると推測していますが、わかりません。私の最高の 推測は.HasRequiredですが、私はそれを書き直す方法がわかりません。 このコードがないと、外部キーが正しく作成されません。 および循環参照の問題。 WillCascadeOnDelete(false)は、 循環参照の問題を停止します。

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

編集1: 私は私の問題は、データアクセス層であるが、そうでない場合は、私は私のアプリケーション・サービス・レイヤー「作成」に直接AJAX呼び出しを作っていますかなり確信しています。私が一歩一歩進めるにつれ、すべてが完璧に見えます。それはリターンをヒットし、私は内部サーバーエラーを取得します。他の詳細はありません。私はtry/catchでラップしようとしましたが、catchは決して打たれません。

私はAsp.net Boilerplateフレームワークを使用しています。私はあまりにも運がないプライベートフォーラムに投稿しました。私はそれがデータアクセスレイヤの問題であると仮定したので、ここに投稿しました。

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

編集2: ここに私のサブジェクト表があります。それはいくつかの列と10の外部キーを持っていますが、私は関連するデータだけで短縮します。

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

ANSWER 私は私の答えを考え出しました。私は切替えました。必要なのは.HasOptionalです。みんなの時間を無駄にしてしまって申し訳ありません。ありがとう!以下のコードにつきとして.HasOptionalへ

変更.HasRequired:彼の質問の編集やコメント内のOPの答えから

+0

エラーがデータアクセスレイヤーになっていますか?あなたのコントローラーはどうですか?挿入するデータを指示するチャネルについての詳細情報を指定してください。 – Emad

+0

プログラムメインとプログラムセカンダリの外観は何ですか? – Bit

+1

私は私の答えを理解しました。私は切替えました。必要なのは.HasOptionalです。みんなの時間を無駄にしてしまって申し訳ありません。ありがとう! – Ben

答えて

0

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); 
} 
関連する問題