Ошибка ссылочной целостности EF 4.1

#c# #.net #exception-handling #entity-framework-4.1 #ef-code-first

#c# #.net #исключение #entity-framework-4.1 #ef-code-first

Вопрос:

У меня есть следующие классы:

 public class Person
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    public string Email { get; set; }

    public virtual Survey Survey { get; set; }
}

public class Survey
{
    [Key]
    public Guid Id { get; set; }

    public bool IsFinished { get; set; }

    public virtual ICollection<UserAnswer> UserAnswers { get; set; }

    public virtual Person Person { get; set; }
}

public class UserAnswer
{
    [Key]
    public Guid Id { get; set; }

    public Guid SurveyId { get; set; }
    public virtual Survey Survey { get; set; }

    public Guid QuestionId { get; set; }
    public virtual Question Question { get; set; }

    public Guid AnswerId { get; set; }
    public virtual Answer Answer { get; set; }
 }
  

В моем datacontext я определил:

  modelBuilder.Entity<Survey>().HasRequired(s => s.Person).WithOptional();
 modelBuilder.Entity<Survey>().HasMany(s => s.UserAnswers).WithRequired(a => a.Survey).HasForeignKey(a => a.SurveyId).WillCascadeOnDelete(false);
  

Может кто-нибудь сказать мне, что я делаю неправильно?

Обновить:

Когда я выполняю этот код:

 var surveyRepository = new SurveyRepository();
foreach (var userAnswer in userAnswers)
{
    survey.UserAnswers.Add(userAnswer);
}
surveyRepository.InsertOrUpdate(survey);
surveyRepository.Save();
  

Я получаю следующую ошибку:

Произошло нарушение ограничения ссылочной целостности: значения свойств, которые определяют ссылочные ограничения, не согласуются между основными и зависимыми объектами во взаимосвязи.

Комментарии:

1. Какую ошибку вы получили и когда?

Ответ №1:

Пожалуйста, попробуйте этот способ

  var surveyRepository = new SurveyRepository();
 foreach (var userAnswer in userAnswers)
 {
     userAnswer.SurveyId = Survey.Id;
     survey.UserAnswers.Add(userAnswer);
 }
 surveyRepository.InsertOrUpdate(survey);
 surveyRepository.Save();
  

Комментарии:

1. В моем случае это проблема многих ко многим. Существуют Business сущность и Category entity. Я хочу, чтобы у каждого бизнеса было несколько Category ов, как мне присоединить их, используя их CategoryID ов?

2. @Shimmy category.BusinessId = Business.Id или business.Categories.Add(category) ?

3. Если Business существует и Id вам известно, используйте его, в противном случае просто используйте Add , но я думаю, что вы охвачены в любом случае.

Ответ №2:

Я знаю, что уже поздно, но, возможно, это могло бы быть кому-то полезно. Как насчет того, чтобы попробовать это?

 var surveyRepository = new SurveyRepository();
surveyRepository.InsertOrUpdate(survey);
foreach (var userAnswer in userAnswers)
{
   survey.UserAnswers.Add(userAnswer);
}
surveyRepository.Save();
  

Недавно у меня было сообщение о том, что «Произошло нарушение ограничения ссылочной целостности: значения свойств, которые определяют ссылочные ограничения, не согласуются между основными и зависимыми объектами в отношениях.» ошибка при редактировании объекта с дочерними объектами.

Это был мой код в начале:

 myAction.ActionUserNameAssignations.Clear();

string[] sSelectedValues = CheckBoxListHelper.GetAllIds(collection, "CheckBox_UserName_", true).ToArray();
foreach (string userName in sSelectedValues)
{
   ActionUserNameAssignation assignation = new ActionUserNameAssignation { ActionId = myAction.ActionId, UserName = userName };
   myAction.ActionUserNameAssignations.Add(assignation);
}

db.Actions.Attach(myAction);
db.ObjectStateManager.ChangeObjectState(myAction, EntityState.Modified);
db.SaveChanges();
  

И это мой код в конце, работает нормально:

 db.Actions.Attach(myAction);
db.ObjectStateManager.ChangeObjectState(myAction, EntityState.Modified);

myAction.ActionUserNameAssignations.Clear();

string[] sSelectedValues = CheckBoxListHelper.GetAllIds(collection, "CheckBox_UserName_", true).ToArray();
foreach (string userName in sSelectedValues)
{
   ActionUserNameAssignation assignation = new ActionUserNameAssignation { ActionId = myAction.ActionId, UserName = userName };
   myAction.ActionUserNameAssignations.Add(assignation);
}

db.SaveChanges();
  

Как вы можете видеть, разница в основном заключается в привязке объекта к контексту в начале. Я надеюсь, что это поможет 🙂

Ответ №3:

При определении вашей модели вам не нужно указывать свойства ссылочного идентификатора, EF создаст их в базе данных за вас.

Измените свою модель пользовательского ответа на

 public class UserAnswer
{
    [Key]
    public Guid Id { get; set; }

    public virtual Survey Survey { get; set; }

    public virtual Question Question { get; set; }

    public virtual Answer Answer { get; set; }
} 
  

Комментарии:

1. Нет, дело не в этом, у меня есть несколько других классов, где я использовал ключи, и они отлично работают. Я удалил ключ и все та же ошибка. Спасибо за ответ