В настоящее время я работаю над приложением, которое работает с динамическими формами вопросников. , которые определены в базе данных следующим образом: Формы> Разделы> Элементы управления> Вопросы.Код элемента 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");
});
}
}
Это приводит к следующему производится в базе данных:
Наконец, мои вопросы:
[Решено]
Почему многие из многих объединяются в таблицу, игнорируя сопоставления для имени таблицы и ключей, указанных в 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 были бы весьма признательны. Сначала я начинаю сожалеть о выборе кода, но я не знаю, является ли это первым кодом проблемы или моего понимания.
Спасибо!
Вы добавили 'BusinessRuleConfiguration' в конфигурацию modelBuilder в' OnModelCreating'? – Slauma
Да, я тоже думаю. Вы добавили конфигурации в класс контекста, переопределив OnModelCreating()? 'modelBuilder.Configurations.Add (новый BusinessRuleConfiguration());' 'modelBuilder.Configurations.Add (новый QuestionConfigruation());' –
Ahhh, глупый, я забыл добавить конфигурацию BusinessRule. Спасибо, ребята, эта проблема решена. –