1

私は現在、動的なアンケートフォームで動作するアプリケーションに取り組んでいます。次のようにデータベースで定義されているフォーム:[フォーム]>[セクション]>[コントロール]>[質問]。

各質問には、必須、最小長、最大長などの多くのビジネスルールを含めることができます。

各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の経験が豊富な人の助けをいただければ幸いです。私は最初にコードを選択したことを後悔し始めていますが、それが問題であるのか、それとも私の理解であるのかがわかりません。

ありがとう!

4

2 に答える 2

0

エンティティ フレームワークに入る前に、あなたのモデルはビジネス上の問題を正しく反映していないと思います。その結果、無効な関係がエラーを引き起こしています。

LinkedBusinessRules BusinessRules に関するビジネス上の問題について、さらに詳しい情報を提供していただけますか。

あなたが言及したことに基づいて、あなたの質問/ビジネスルールクラスはこのように見えます。

注意すべきことは、「1 つの質問が多くのビジネス ルールに関係し、そのビジネス ルールには多くの質問がある」ということではなく、

「1 つの質問には 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<BusinessRule> BusinessRules { get; set; }
}

public class BusinessRule
{
    public int Id { get; set; }
    public string ValidationMessage { get; set; }
    public string ConditionValue { get; set; }
    public int BusinessRuleTypeId { get; set; }
    public virtual string BusinessRuleType { get; set; }
}

それでも問題があり、優れたデータベース設計スキルがある場合は、 http://salardbcodegenerator.codeplex.com/などのツールを使用してください 。次に、最初にデータベースを作成し、それに基づいてクラスを生成できます。

于 2012-05-25T14:08:17.807 に答える
0

Resolved!

First issue was because I had forgotten to add the BusinessRule configuration as point out by @Slauma and @Abhijit.

The second problem of saving a new form was actually to do with a number of problems that i didnt detail in the question.

于 2012-05-25T15:39:52.920 に答える