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; }        
}

测试方法出奇地有效,没有冲突。

即使我没有指定,插入的 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。当您创建 aBar时,它FooId是 0,它“将它”“连接”到Foo. 当您单独保存它们时,上下文将 0 以外的 ID 分配给Foo,并且当您创建0 时,BarFooID不会将其连接到现有的Foo,因此您会遇到异常。

于 2012-10-29T00:31:32.260 回答