EF 4.1 Ошибка ссылочной целостности - PullRequest
11 голосов
/ 16 мая 2011

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

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

В моем тексте данных я определил:

 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();

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

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

Ответы [ 3 ]

6 голосов
/ 23 июня 2011

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

 var surveyRepository = new SurveyRepository();
 foreach (var userAnswer in userAnswers)
 {
+    userAnswer.SurveyId = Survey.Id;
     survey.UserAnswers.Add(userAnswer);
 }
 surveyRepository.InsertOrUpdate(survey);
 surveyRepository.Save();
1 голос
/ 14 февраля 2012

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

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();

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

0 голосов
/ 16 мая 2011

При определении вашей модели вам не нужно указывать свойства ссылочного идентификатора, которые 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; }
} 
...