3

次の「問題」に出くわしました(これは単なる機能かもしれませんが、それはかなり奇妙なものです)。Entity Framework 5 を使用して、外部キーを介してリンクされたエンティティを指定せずにエンティティを挿入すると、EF は関連するエンティティに値を自動的に割り当てます (同時に挿入された場合)。

さて、それはあまり明確ではないので、動作を再現するコードを次に示します。

[TestClass]
public class TestEntityFramework
{
    [TestMethod]
    public void Test()
    {
        using (var context = new TestDataContext())
        {
            context.Foos.Add(new Foo { FooProp = "FooProp"});                
            context.Bars.Add(new Bar {BarProp = "BarProp"});                
            context.SaveChanges();
        }
    }       
}


public class Foo
{
    [Key]
    public int Id { get; set; }

    public string FooProp { get; set; }
}

public class Bar
{
    [Key]
    public int Id { get; set; }

    public int FooId { get; set; }
    [ForeignKey("FooId")]
    public virtual Foo Foo { get; set; }

    public string BarProp { get; set; }
}

public class TestDataContext : DbContext
{      
    public virtual IDbSet<Foo> Foos { get; set; }
    public virtual IDbSet<Bar> Bars { get; set; }        
}

Test メソッドは驚くほど機能し、競合はありません。

挿入された Bar エンティティは、指定していないにもかかわらず、同時に挿入された Foo エンティティにリンクされます。

ただし、次のコードは両方とも外部キー例外を発生させます。

[TestMethod]
public void Test()
{
    using (var context = new TestDataContext())
    {
        context.Foos.Add(new Foo { FooProp = "FooProp"});
        context.SaveChanges();
        context.Bars.Add(new Bar {BarProp = "BarProp"});                
        context.SaveChanges();
    }
}

[TestMethod]
public void Test2()
{
    using (var context = new TestDataContext())
    {
        context.Foos.Add(new Foo { FooProp = "FooProp" });
        context.Foos.Add(new Foo { FooProp = "FooProp2" });                
        context.Bars.Add(new Bar { BarProp = "BarProp" });
        context.SaveChanges();
    }
}     

その動作が予想されるかどうかは誰にもわかりますか? 何かご意見は ?

ありがとう

4

1 に答える 1

3

私の推測では、保存する前に両方を作成すると、両方とも ID が 0 にBarなりFooIdますFoo。それらを個別に保存すると、コンテキストは に 0 以外の ID を割り当て、Foo作成時にBar0の IDFooIDを既存の ID に接続しないためFoo、例外が発生します。

于 2012-10-29T00:31:32.260 に答える