检索新插入的项时,虚拟属性为null

时间:2012-08-12 23:48:48

标签: .net entity-framework entity

我正在使用EF4.x,Code First和Castle Windsor进行DI。我的问题:在检索新插入的实体时,某些虚拟属性将返回null。我是新手,所以请原谅我对一切运作方式的无知。一个非常简单的例子是这样的:

public class Address
{
    public int AddressID { get; set; }
    public string Street { get; set; }
    public int ProvinceID { get; set; }
    public virtual Province { get; set; }
    etc....
}

public class Province
{
    public int ProvinceID { get; set; }
    public string Name { get; set; }
    public string Abbreviation { get; set; }
    public int DisplayOrder { get; set; }
    etc...
}

因此,在SaveChanges()之后,我可以看到在db中正确创建的记录,但是在加载Address实体的后续页面请求中,正确设置了RegionID,但虚拟省为空。重建后,没有问题。我究竟做错了什么? TIA

更多信息:

我在Repository和Unit of Work模式中使用DbContext。我有一个抽象的EF RepositoryBase类,它包含所有常见的CRUD方法。以下是常见GET方法的示例:

  public T Get(params object[] keyValues)
  {
     return _dbSet.Find(keyValues);
  }

  public IQueryable<T> Get(Func<T, bool> filter)
  {
     return _dbSet.Where(filter).AsQueryable();
  }

  public IQueryable<T> GetAll()
  {
     return _dbSet.AsQueryable();
  }

_dbSet设置如下:

_dbSet = ((DbContext)_context).Set<T>(); // _context is of IDbContext

这里的某些东西可能导致这个奇怪的问题?

2 个答案:

答案 0 :(得分:2)

因此,在导航属性加载,延迟加载和显式加载方面,您实际上有2个EF选项。根据我的经验,显式加载要好得多,因为它会导致更大的性能问题。

我写了一篇关于导航属性的文章,你可以阅读here

要使用显式导航属性加载,可以使用.Include语句指定在每个查询中加载哪些属性。

当您使用延迟加载时,我相信您需要在您的上下文中虚拟装饰所有导航属性,并且当您调用get属性时会查询数据库。

答案 1 :(得分:0)

我使用下一个解决方法:分离实体并再次加载

public T Reload<T>(T entity) where T : class, IEntityId
{
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
}