【问题标题】:Use EF to select object and its properties使用 EF 选择对象及其属性
【发布时间】:2012-07-01 22:49:20
【问题描述】:

我在 EF 4.3.1 中工作,在插入方面一切都进展顺利。但现在我正试图将我插入的对象拉回来以显示在我的 MVC3 项目的视图中并且遇到问题。

在我的 DAL 中,我有以下方法从数据库中获取 Church 对象:

public virtual TEntity GetById(object id)
{
    return _db.Find(id);
}

对象本身如下所示:

public class Church
{
    //Basic Properties
    public int Id { get; set; }
    public string Name { get; set; }
    public string Website { get; set; }

    ... (some properties)

    //Church Contacts and Services
    public List<Contact> Contacts { get; set; }
    public List<Service> Services { get; set; }

    ....

}

请注意最后两个属性:联系人和服务。每个都是我数据库中的 1:Many 表。不过,Find() 似乎没有返回任何内容。它只是将这两个属性设置为 null。

数据库中的实际条目看起来就像我期望的那样。每个教会都有一些与之相关的联系人和服务。然而,它永远不会映射回模型......

有什么想法吗?

编辑是的,看起来直到我明确告诉它才加载这些属性。我通过将其添加到我的 ChurchRepository(从 GenericRepository 继承)修改了我的查询

public override Church GetById(object id)
{
    return _db.Include("Contacts").Include("Services").FirstOrDefault(c => c.Id == (int)id);
}

【问题讨论】:

标签: c# asp.net-mvc-3 entity-framework


【解决方案1】:

您应该将导航属性标记为虚拟,或者您也可以在不延迟加载的情况下包含它们,这是最佳做法。

试试这个

db.Churces.Include(entity=>entity.Services).
Include(entity=>entity.Contacts).SingleOrDefault(entity=>entity.Id == id)

您可能需要为 Include 扩展方法导入 System.Data.Entity 命名空间。

【讨论】:

  • 由于某种原因这不起作用,我不能在那里使用 lambda 并让它运行。但是,我在 OP 中的解决方案似乎非常相似。 (是的,我添加了 System.Data.Entity,但还是不行)
  • 如果您在导入命名空间后看不到 lambda 版本的 Include 方法,那么您完全使用的是低于 4.1 的版本。
  • 检查属性中的版本:运行时版本:v4.0.30319,版本:4.3.1
  • 是的,我有一个 ChurchRepository 来保存我使用的上下文和数据库集,还有一个 UnitOfWork 类来访问上下文的单个实例
  • OK 因此,您可以通过右键单击实体框架 dll 使用对象浏览器并导航到 System.Data.Entity 命名空间以查找包含扩展方法。你有问题
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2022-12-19
  • 2021-12-04
相关资源
最近更新 更多