11

:EF 4.1 Bilgi tutarlılığı hatası aşağıdaki sınıfları

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

benim datacontext ben tanımlamış:

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

birisi yanlış yapıyorum bana söyleyebilir misiniz?

Güncelleme:

Bu kodu çalıştırdığınızda: modelinizi tanımlarken

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

Ne tür bir hata yaptınız? –

cevap

6

için UserAnswer modeli, bunu geç, biliyorum bu şekilde

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

cevabı için Benim durumumda çok fazla sorun var. "İşletme" varlığı ve "Kategori" varlığı var. Her işletmenin birden çok Kategori’e sahip olmasını istiyorum. KategoriID’lerini kullanarak bunları nasıl ekleyebilirim? – Shimmy

0

belirttiğiniz gerekmez: aşağıdaki hatayı alıyorum

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

Referans Kimlik özellikleri EF, bunları sizin için veritabanında oluşturacaktır.

Değişim

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

Hayır, o kadar değil, anahtarları kullandım ve iyi çalışıyorlar. Anahtarı ve hala aynı hatayı kaldırdım. Thx yine de – Nealv

1

deneyin ama belki bu bir kişi için yararlı olabilir. Bunu denemeye ne dersin?

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

Son zamanlarda "bir başvuru bütünlüğü kısıtlama ihlali oluştu: referans kısıtlamaları tanımlayan özellik değerleri ilişkide ana ve bağımlı nesneler arasında tutarlı değildir." Bu vardı I olan bir varlık düzenlerken hata çocuklar.

Bu başlangıçta benim kodu:

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

Ve bu iyi çalışıyor, sonunda benim kodudur:

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

Gördüğünüz gibi, fark temelde varlık ekleme edilir başlangıçta bağlam için. Umarım yardımcı olur :)