加载新断开连接的实体的预先存在的导航属性

时间:2013-04-08 23:23:30

标签: entity-framework ef-code-first entity-framework-5 dbcontext navigation-properties

我有一个新的断开连接的POCO(在我的情况下来自aspnet mvc modelbinder)。

public class OfflineEntry
{
    public virtual int Id { get; set; }
    public virtual Category Category { get; set; }
    public virtual int CategoryId { get; set; }
}

外键属性(CategoryId)设置为现有数据库值,但导航引用(Category)最初为空。加载导航参考的正确方法是什么?我希望第一步是将新对象添加到上下文中。然后在SaveChanges之前,我可以使用延迟加载,还是LoadProperty,还是必须手动设置?

public ContentResult Save(OfflineEntry o)
{
    db.OfflineEntries.Add(o);
    var categoryName = o.Category.Name; //?
    db.SaveChanges();
    return Content("ok");
}

public class Category
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    //optional 2-way nav property
}

1 个答案:

答案 0 :(得分:2)

我希望其他人会跳过这个专家,但我发现你遇到的一个问题是你的OfflineEntry实例不是从你的DbContext创建的,因而是LazyLoading没有去上班。

通常,最好不要将实体模型用作视图模型,这是其中一个原因。

所以我的建议是创建一个NewOfflineEntryViewModel,如下所示:

public class NewOfflineEntryViewModel
{
    public int CategoryId { get; set; }
}

然后手动从DbContext中检索类别

public ContentResult Save(NewOfflineEntryViewModel model)
{
    var category = db.Categories.Find(model.CategoryId);

    var newEntry = db.OfflineEntries.Create();
    db.OfflineEntries.Add(newEntry);
    newEntry.Category = category;

    db.SaveChanges();

    var categoryName = category.Name; //for whatever you needed with this

    return Content("ok");
}