11

Tengo las siguientes clases:EF 4.1 error de integridad referencial

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

en mi DataContext he definido:

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

Puede alguien decirme lo que estoy haciendo mal?

Actualización:

Cuando ejecuto este código:

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

me sale el siguiente error:

A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship.

+0

¿Qué error obtuviste y cuándo? –

Respuesta

6

Por favor, intente esta manera

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

En mi caso es un problema de muchos a muchos. Hay una entidad 'Business' y una entidad' Category'. Quiero que cada empresa tenga múltiples 'Category's, ¿cómo las adjunto, usando sus' CategoryID's? – Shimmy

0

Al definir su modelo, no es necesario especificar las propiedades de Id. de referencia EF las creará en la base de datos por usted.

Cambie su modelo UserAnswer a

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

No, no es eso, tengo otras clases en las que utilicé claves y funcionan bien. Eliminé la clave y sigo teniendo el mismo error. Sin embargo, para la respuesta – Nealv

1

Sé que es tarde, pero tal vez esto podría ser útil para alguien. ¿Qué tal intentar esto?

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

recientemente he tenido que "se produjo Un referencial violación de restricción de integridad: Los valores de las propiedades que definen las restricciones de referencia no son consistentes entre el principal y los objetos dependientes en la relación." Cuando estaba editando una entidad con niños.

Esta fue mi código al principio:

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

y este es mi código al final, trabajando muy bien:

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

Como se puede ver, la diferencia está básicamente Colocación de la entidad al contexto al principio. Espero que ayude :)

Cuestiones relacionadas