5

我在我的域项目中定义了一个(poco?)类:

public class Club
{
   public Club()
   {
      ContactPersons = new HashSet<ContactPerson>();
   }

   public int Id { get; set; }

   [Required]
   [StringLength(64)]
   public string Name { get; set; }

   public virtual ICollection<ContactPerson> ContactPersons { get; set; }
}

public class ContactPerson
{
     public virtual int Id { get; set; }

     [StringLength(64)]
     public virtual string FirstName { get; set; }

     [StringLength(64)]
     public virtual string LastName { get; set; }
 }

在我的 MVC 项目中,我有我的俱乐部控制器:

   public ActionResult Create(CreateClubViewModel model)
   {
      Club club = new Club();
      model.Initialize(club);
      IClubDb clubDb = DependencyResolverHelper.IClubDbService;
      clubDb.Create(club);  // create club in db
   }

    public ActionResult Display(string domain)
    {
        try
        {
            IClubDb clubDb = DependencyResolverHelper.IClubDbService;
            Club club = clubDb.Get(domain);
            return View(club);
        }
        catch (Exception)  // user is not logged iin
        {
            return View();
        }
    }

最后,在我的数据库项目中,我创建并检索了俱乐部,

public Club Get(string name)
{
   return DataContext.Clubs
   //.Include(x => x.ContactPersons)
   .Single(r => r.Name == name);
}

 public int Create(Club club)
 {
         DataContext.Clubs.Add(club);
         return DataContext.SaveChanges();
 }

当我在 Display 方法中调用 Get club 时,我已尽一切努力让 EF 延迟加载我的俱乐部对象的 ContactPersons,但 ContactPersons 的长度始终为零。但是,如果我渴望使用 .include 加载联系人(我已将这部分注释掉),那么显然 ContactPersons 包含许多联系人。

我不确定我做错了什么:

  1. 我遵循了定义 poco 类的指南:http: //msdn.microsoft.com/en-us/library/dd468057.aspx
  2. 我有一个公共参数少的构造函数(但不是受保护的构造函数)
  3. 我启用了延迟加载

我想我错过了一个概念,poco club 类也是我插入数据库的域实体。我究竟做错了什么?为什么我不能让延迟加载工作?

4

3 回答 3

1

尝试 ContactPersons.ToList();

这将强制加载所有实体。见实体框架,调用 ToList() 时会自动加载 FK 对象吗?

于 2013-08-20T19:22:03.317 回答
0

您是否忘记在您的实体中包含外键?

public class ContactPerson
{
    public virtual int Id { get; set; }

    [StringLength(64)]
    public virtual string FirstName { get; set; }

    [StringLength(64)]
    public virtual string LastName { get; set; }

    public int ClubId { get; set; }
    [ForeignKey("ClubId")]
    public virtual Club Club { get; set; } // if you need
}
于 2013-02-20T19:02:29.003 回答
0

似乎您的 LazyLoading 在您的 dbContext 关闭时执行。所以它不会加载。您在视图中使用 ContactPerson,对吗?

于 2013-01-01T21:59:51.040 回答