11

我有以下類別: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); 

誰能告訴我什麼,我做錯了什麼?

更新:

當我執行此代碼:

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

我得到以下錯誤:

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

你得到什麼錯誤,什麼時候? – 2011-05-16 10:14:08

回答

6

請嘗試這種方式

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

在我的情況下,這是一個多對多的問題。有'商業'實體和'類別'實體。我希望每個企業都有多個「類別」,我如何使用他們的CategoryID來附加他們? – Shimmy 2013-06-08 21:38:19

0

當定義你的模型,你並不需要指定參考ID屬性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; } 
} 
+0

不,那不是,我有一些其他類,我用鑰匙,他們工作正常。我刪除了鍵,仍然是相同的錯誤。 Thx雖然爲答案 – Nealv 2011-05-16 11:59:32

1

我知道已經晚了,但也許這可能是有用的人。試試這個怎麼樣?

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

正如你所看到的,所不同的是基本附加實體在開始的背景下。我希望它有幫助:)