0

问题

不知道这样做的正确方法是什么......我有一个简单的课程:

public partial class Event
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int? PreviousEventId { get; set; }
    public virtual Event PreviousEvent { get; set; }
}

在我的 MVC 3 项目中,我有一个用于编辑事件描述和(可选)从下拉列表中选择上一个事件的表单。表单被提交给一个动作,并且像 MVC 3 一样,自动映射到一个Event

[HttpPost]
public ActionResult SaveEvent(Event myEvent)
{
    if (ModelState.IsValid)
    {
        Db.Entry(myEvent).State = EntityState.Modified;
        // do some additional checks
        Db.SaveChanges();
    }
}

PreviousEvent在保存我的实体之前,我想做一些需要访问的额外验证。但是,导航属性始终是null当我在上面的代码中访问它时。这是有道理的——表单直接映射到我的 POCO 类,Event而不是 EF 创建的代理。

问题

有什么方法可以将我的修改换成Event它的代理,以便 EF 可以帮助加载它的导航属性?我可以:

Db.Entry(myEvent).Reference(e => e.PreviousEvent).Load();
// do some checking on myEvent.PreviousEvent

...但是以这种方式加载所有导航属性似乎很普通(这个类比显示的要多得多),我希望 EF 有更好的方法来做到这一点。真的吗?

4

1 回答 1

1

您要求的是支持延迟加载传递给您的操作的实体实例。延迟加载是通过 EF 创建的动态代理(= 动态创建的派生类型)提供的。一旦在没有代理的情况下创建实例,它就不能使用延迟加载,也不能更改为允许它!

要创建支持延迟加载的实例,您必须使用:

Event event = context.Events.Create();

但默认模型绑定器仅使用默认构造函数。

Event event = new Event();

因此,如果您想要支持延迟加载,您必须为此编写自己的模型绑定器。

一旦你有代理实例,你可以简单地将实例附加到上下文中,延迟加载应该适合你。

于 2011-07-06T12:27:49.003 回答