我遇到了以下“问题”(它可能只是一个功能,但这将是一个非常奇怪的问题)。使用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();
}
}
任何人都知道这种行为是否是预期的?有什么想法吗?
谢谢
答案 0 :(得分:3)
我的猜测是,在您保存之前创建它们时,它们的ID都为0.当您创建Bar
时,它FooId
为0,并且#34;连接它&# 34;到Foo
。当您单独保存它们时,上下文会为Foo
分配0以外的ID,当您创建Bar
时,{0}的FooID
不会将其连接到现有Foo
因此你得到一个例外。