实体框架自动分配外键?

时间:2012-10-28 23:59:35

标签: c# entity-framework

我遇到了以下“问题”(它可能只是一个功能,但这将是一个非常奇怪的问题)。使用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();
    }
}     

任何人都知道这种行为是否是预期的?有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:3)

我的猜测是,在您保存之前创建它们时,它们的ID都为0.当您创建Bar时,它FooId为0,并且#34;连接它&# 34;到Foo。当您单独保存它们时,上下文会为Foo分配0以外的ID,当您创建Bar时,{0}的FooID不会将其连接到现有Foo因此你得到一个例外。