0

我正在使用带有 Code-First 的 EntityFramework 5.0。我有一个像这样的 POCO 类 Foo:

public class Bar
{
    public int FooID { get; set; }
    public virtual Foo Foo { get; set; }

    public int OtherFooID { get; set; }
    public virtual Foo OtherFoo { get; set; }
}

在我的 DbContext 中,延迟加载已打开。当我从上下文加载 Foo 时,属性“Foo”是延迟加载的,预期使用 FooID 作为外键。但是,无论我如何尝试,都不会加载“OtherFoo”。

Foo f = bar.Foo;         // A proxy type, which loads in the data from the DB correctly
Foo f = bar.OtherFoo;    // is null, not lazily loaded
Foo f = context.Bars.Include("OtherFoo").First(...).OtherFoo;   // Still null

(如果重要的话,我有一个 UserProfile 表,并且我的模型对象有 CreatedByUser 和 LastModifiedByUser 字段,除非我将一个及其关联的 *ID 字段重命名为“User”,否则这两个字段都不起作用)

是否有我可以粘贴在这些字段上的属性来告诉 Entity 如何加载它们,或者如果我覆盖它,我可以在 DbContext.OnModelBuilding 方法中设置什么?

4

1 回答 1

0

我猜是一个映射问题,因此 EF 无法识别OtherFooIDOtherFoo. OtherFooID不可为空,并且关系是必需的,即数据库中必须有关联OtherFoo(除非您在数据库中关闭了 FK 约束强制)。

您可以使用数据注释显式指定外键...

[ForeignKey("OtherFoo")]
public int OtherFooID { get; set; }

... 或流利的 API:

modelBuilder.Entity<Bar>()
    .HasRequired(b => b.OtherFoo)
    .WithMany() // add f => f.OtherBars here, if you have a collection in Foo
    .HasForeignKey(b => b.OtherFooID);

如果您收到“不允许使用多个级联删除路径”的异常,请追加

    .WillCascadeOnDelete(false);

在 Fluent 映射的末尾。

于 2013-04-19T14:15:02.497 回答