私のサブジェクトテーブル(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の答えから
エラーがデータアクセスレイヤーになっていますか?あなたのコントローラーはどうですか?挿入するデータを指示するチャネルについての詳細情報を指定してください。 – Emad
プログラムメインとプログラムセカンダリの外観は何ですか? – Bit
私は私の答えを理解しました。私は切替えました。必要なのは.HasOptionalです。みんなの時間を無駄にしてしまって申し訳ありません。ありがとう! – Ben