コードファーストのアプローチでEntity Framework 5を使用しています。
私はテストシステムをやろうとしています。1 対 1 および 1 対多の関係を持つ 5 つのクラスがあります。1 つの Test には 1 つの TestInfo があり、1 つの User には多くの TestResult があり、1 つの TestResult には 1 つの TestInfo と多くの QuestionResult があります。これらは次のとおりです (いくつかの単純な値型プロパティは除きます)。
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 プロパティを削除すると、すべて正常に動作します。私には奇妙に思えます。私は何を間違っていますか?