我正在使用實體框架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財產,一切工作正常。這對我來說似乎很奇怪。 我是什麼?做錯了
謝謝,我試過了,但有同樣的例外。 –
結果是一個新的結果,或存在,與現有的QuestionResults? –
表'TestResults'是否有一個自動遞增的主鍵(標識列)? –