2

我正在为 DI 使用 EF4.x、Code First 和 Castle Windsor。我的问题:某些虚拟属性在检索新插入的实体时返回 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 中正确创建的记录,但是在加载地址实体的后续页面请求中,ProvinceID 设置正确,但虚拟省为空。重建后,没有任何问题。我究竟做错了什么?TIA

更多信息:

我在存储库和工作单元模式中使用 DbContext。我有一个包含所有常见 CRUD 方法的抽象 EF RepositoryBase 类。以下是常见 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

也许这里的某些东西导致了奇怪的问题?

4

2 回答 2

2

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

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

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

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

于 2012-08-13T06:08:19.627 回答
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);
}
于 2015-03-21T04:11:08.077 回答