我正在使用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
这里的某些东西可能导致这个奇怪的问题?
答案 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);
}