私は現在、動的なアンケートフォームで動作するアプリケーションに取り組んでいます。次のようにデータベースで定義されているフォーム:[フォーム]>[セクション]>[コントロール]>[質問]。
各質問には、必須、最小長、最大長などの多くのビジネスルールを含めることができます。
各BusinessRuleは、1つの質問のルールです。ただし、別の質問の値を取得する必要がある複雑なビジネスルールがあります。したがって、各ビジネスルールには、必要な値を取得するための多くのリンクされた質問を含めることができます。
私は初めてコードを使用し、この関係のために次の定義クラスとマッピングを持っています:
public class Question
{
public int Id { get; set; }
public string Name { get; set; }
public int ValueTypeId { get; set; }
public int ParentQuestionId { get; set; }
public virtual ValueType ValueType { get; set; }
public virtual ICollection<Question> ChildQuestions { get; set; }
public virtual ICollection<BusinessRule> BusinessRules { get; set; }
public virtual ICollection<BusinessRule> LinkedBusinessRules { get; set; }
}
public class BusinessRule
{
public int Id { get; set; }
public string ValidationMessage { get; set; }
public string ConditionValue { get; set; }
public int QuestionId { get; set; }
public int BusinessRuleTypeId { get; set; }
public virtual BusinessRuleType BusinessRuleType { get; set; }
public virtual Question Question { get; set; }
public virtual ICollection<Question> LinkedQuestions { get; set; }
}
internal class QuestionConfigruation : EntityTypeConfiguration<Question>
{
public QuestionConfigruation()
{
this.HasMany<Question>(q => q.ChildQuestions)
.WithOptional()
.HasForeignKey(q => q.ParentQuestionId);
this.HasMany(q => q.BusinessRules)
.WithRequired(br => br.Question)
.WillCascadeOnDelete(false);
}
}
internal class BusinessRuleConfiguration : EntityTypeConfiguration<BusinessRule>
{
public BusinessRuleConfiguration()
{
this.HasMany(b => b.LinkedQuestions)
.WithMany(q => q.LinkedBusinessRules)
.Map(map =>
{
map.ToTable("BusinessRuleLinkedQuestions");
map.MapLeftKey("LinkedQuestionId");
map.MapRightKey("BusinessRuleId");
});
}
}
これにより、データベースで次のように生成されます。
最後に、私の質問:
[解決済み]
BusinessRuleConfigurationで指定したテーブル名とキーのマッピングを無視する多対多の結合テーブルはなぜですか?
[/解決済み]
これを実行してカスタムイニシャライザーを使用してテストフォームを挿入しようとすると、次のようになります。
var companyName = new Question
{
Name = "CompanyName",
ValueTypeId = _typeRepository.GetValueType(ValueTypes.String).Id,
BusinessRules = new List<BusinessRule>{
new BusinessRule
{
BusinessRuleTypeId = _typeRepository.GetBusinessRuleType(BusinessRuleTypes.required).Id,
ValidationMessage = "Company name is required.",
}
}
};
var form = new Form
{
Sections = new List<Section>
{
new Section(){
Controls = new List<Control>
{
new Control{
ControlTypeId = _typeRepository.GetControlType(ControlTypes.Textbox).Id
Questions = new List<Question>
{
companyName,
}
}
}
}
}
}
次のエラーが発生します。
Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.
私はこれを解決するために非常に長い時間を費やしてきたので、EFとCodeFirstの経験が豊富な人の助けをいただければ幸いです。私は最初にコードを選択したことを後悔し始めていますが、それが問題であるのか、それとも私の理解であるのかがわかりません。
ありがとう!