3

コードファーストのアプローチで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 プロパティを削除すると、すべて正常に動作します。私には奇妙に思えます。私は何を間違っていますか?

4

3 に答える 3

-1

別のデータ アクセス レイヤー (DAL) で EF5 フレームワークを使用しているときに、この問題に遭遇しました。これを修正するには、外部キー クラスを反復処理して再アタッチする必要がありました。もっと良い方法があると思いますが、これで投稿をやり遂げました。

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

これが役立つかどうか教えてください!

于 2013-06-28T15:35:06.127 に答える