2013-05-31 35 views
3

我正在使用實體框架5和代碼優先方法。嘗試使用外鍵添加實體時違反主鍵

我正在嘗試做一個測試系統。它有五個類,具有一對一和一對多的關係。一個測試有一個TestInfo,一個用戶有很多TestResults,一個TestResult有一個TestInfo和許多QuestionResults。在這裏,他們是(沒有一些簡單的數值型屬性):

public class TestInfo 
{ 
    [Key] 
    public virtual string Name { get; set; } 
    public virtual TimeSpan Duration { get; set; } 
} 

public class Test 
{ 
    [Key] 
    public virtual int TestId { get; set; } 
    public virtual TestInfo Info { get; set; } 
    //some other stuff 
    //... 
} 

public class User 
{ 
    [Key] 
    public virtual string Login { get; set; } 

    List<TestResult> _results = new List<TestResult>(); 
    public virtual List<TestResult> Results 
    { 
     get { return _results; } 
     set { _results = value; } 
    } 
    //... 
} 

public class TestResult 
{ 
    [Key] 
    public virtual int TestResultId { get; set; } 
    public virtual TestInfo TestInfo { get; set; } 
    //... 

    private List<QuestionResult> _questionResults = new List<QuestionResult>(); 
    public virtual List<QuestionResult> QuestionResults 
    { 
     get { return _questionResults; } 
     set { _questionResults = value; } 
    } 
} 

public class QuestionResult 
{ 
    [Key] 
    public virtual int QuestionResultId { get; set; } 
    //... 
} 

我的背景:

class TestContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Test> Tests { get; set; } 
} 

我嘗試新的TestResult添加到現有用戶的現有測試(TestInfo是一樣的) :

public void AddTestResult(TestResult result) 
{ 
    User user = _context.Users.Include(u => u.Results).FirstOrDefault(u => u.Login == _currentLogin); 
    TestInfo existingTestInfo = _context.Tests.Where(t => t.Info.Name == result.TestInfo.Name).FirstOrDefault().Info; 
    result.TestInfo = existingTestInfo; 
    user.Results.Add(result); 
    _context.SaveChanges(); 
} 

當我做這種方式,EF拋出一個異常:

{「違反PRIMARY KEY約束'PK_dbo.TestInfoes'。無法在對象'dbo.TestInfoes'中插入重複鍵。重複的鍵值是(第一次測試)。\ r \ n該語句已終止。「}

如果我從TestResult中類中刪除QuestionResults財產,一切工作正常。這對我來說似乎很奇怪。 我是什麼?做錯了

回答

0

交換這兩行:

user.Results.Add(result); 
result.TestInfo = existingTestInfo; 

user.Results.Add(result)標誌着整個對象圖作爲Added

+0

謝謝,我試過了,但有同樣的例外。 –

+0

結果是一個新的結果,或存在,與現有的QuestionResults? –

+0

表'TestResults'是否有一個自動遞增的主鍵(標識列)? –

-1

我碰到了這一點。在單獨的數據訪問層(DAL)中使用EF5框架時出現問題。要修復它,我必須遍歷外鍵類並重新附加它們。我懷疑還有更好的辦法,但這讓我超過了這個職位。

if (db.Entry(result.TestInfo).State == EntityState.Detached) 
    db.Entry(result.TestInfo).State = EntityState.Modified; 

讓我知道這是否有幫助!

0

試試這個:

TestInfo existingTestInfo = _context.Tests.Where(t => t.Info.Name == result.TestInfo.Name).Include(i => i.TestInfos).FirstOrDefault().Info; 

我也得到了這個錯誤,直到我包括子表,然後一切工作正常。