2012-05-25 1 views
1

В настоящее время я работаю над приложением, которое работает с динамическими формами вопросников. , которые определены в базе данных следующим образом: Формы> Разделы> Элементы управления> Вопросы.Код элемента Entity Framework Сначала многие из многих сопоставлений игнорируются, а также не сохраняются

Каждый вопрос может иметь множество бизнес-правил, таких как: требуется, MINLENGTH, MaxLength и т.д. и т.п.

Каждый BusinessRule является правилом ровно один вопрос. Однако существуют сложные бизнес-правила, которые требуют получения значения другого вопроса. Поэтому у каждого бизнес-правила может быть много связанных вопросов для получения требуемого значения.

Я использую код первого в первый раз и имеют следующие определения классов и отображение для этих отношений:

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

Это приводит к следующему производится в базе данных:

enter image description here

Наконец, мои вопросы:

[Решено]

Почему многие из многих объединяются в таблицу, игнорируя сопоставления для имени таблицы и ключей, указанных в 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.

Я слишком долго потратил на это, пытаясь решить эту проблему, поэтому помогите кому-то с большим опытом e с EF и Code First были бы весьма признательны. Сначала я начинаю сожалеть о выборе кода, но я не знаю, является ли это первым кодом проблемы или моего понимания.

Спасибо!

+2

Вы добавили 'BusinessRuleConfiguration' в конфигурацию modelBuilder в' OnModelCreating'? – Slauma

+2

Да, я тоже думаю. Вы добавили конфигурации в класс контекста, переопределив OnModelCreating()? 'modelBuilder.Configurations.Add (новый BusinessRuleConfiguration());' 'modelBuilder.Configurations.Add (новый QuestionConfigruation());' –

+0

Ahhh, глупый, я забыл добавить конфигурацию BusinessRule. Спасибо, ребята, эта проблема решена. –

ответ

0

Прежде чем мы попадаем в рамки сущности, я считаю, что ваши модели не отражают вашу бизнес-проблему правильно, и в результате неправильные отношения вызывают ошибки.

Можете ли вы предоставить более подробную информацию о бизнес-проблемы вокруг LinkedBusinessRules BusinessRules

Основываясь на том, что вы упомянули, я вижу ваши классы вопрос/businessrule выглядит более, как это.

Things отметить, Вместо того, чтобы «один вопрос имеет по многим бизнес-правила и бизнес, что правила есть много вопросов»

Сво теперь "имеет один для многих бизнес-правил один вопрос.

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/ Тогда вы можете создать БД первым и классов, основанные на этом.

+0

Отношения, которые вы определили, являются прекрасными, если бизнес-правила не требуют другого значения вопросов. Простой бизнес-правило: RuleType = maxlength, ConditionValue = 10;

Но у меня есть некоторые правила, которые требуют от значения другого вопроса, как: RuleType = SUM, QuestionIdsToSum = 1, 2, 3 Я надеюсь, что это помогает прояснить, что я имею в виду. –

0

Решено!

Первая проблема была связана с тем, что я забыл добавить конфигурацию BusinessRule в качестве точки @Slauma и @Abhijit.

Вторая проблема сохранения новой формы на самом деле связана с рядом проблем, которые я не детализировал в вопросе.

Смежные вопросы