EF 4.1 Ошибка ссылочной целостности
У меня есть следующие классы:
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);
Может кто-нибудь сказать мне, что я делаю неправильно?
Update:
Когда я выполняю этот код:
var surveyRepository = new SurveyRepository();
foreach (var userAnswer in userAnswers)
{
survey.UserAnswers.Add(userAnswer);
}
surveyRepository.InsertOrUpdate(survey);
surveyRepository.Save();
Я получаю следующую ошибку:
Ограничение ссылочной целостности произошло нарушение: имущество значения, которые определяют ссылочный ограничения не согласуются между основных и зависимых объектов в отношения.
Ответы
Ответ 1
Пожалуйста, попробуйте этот способ
var surveyRepository = new SurveyRepository();
foreach (var userAnswer in userAnswers)
{
**userAnswer.SurveyId = Survey.Id;**
survey.UserAnswers.Add(userAnswer);
}
surveyRepository.InsertOrUpdate(survey);
surveyRepository.Save();
Ответ 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 создаст их в базе данных для вас.
Измените модель UserAnswer на
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; }
}