2012-08-12 72 views
2

我使用EF4.x,Code First和Castle Windsor的DI。我的问题:某些虚拟属性在检索新插入的实体时会返回null。我对此很陌生,所以请原谅我对一切工作的无知。一个很简单的例子是这样的:虚拟属性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(),我可以看到在数据库中创建正确的记录,但在加载地址实体随后的页面请求,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 

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

+0

是否启用延迟加载? – 2012-08-13 04:22:16

+0

是否默认启用延迟加载?另外,其他导航属性也可以正常工作,即使这个导航属性只在检索新插入的记录时失败。在下一次重建时,这也开始工作。 – 2012-08-13 05:19:02

+0

而你需要启用代理创建。 – 2012-08-13 05:20:13

回答

2

所以你实际上有2个选项与EF导航属性加载,延迟加载和显式加载。根据我的经验,显式加载要好得多,因为这会导致很大的性能问题。

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

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

当你使用lazyloading时,我相信你需要虚拟装饰全部 nav属性在你的上下文中,当你调用get属性时,数据库会被查询。

+0

谢谢卢克。这是一篇很棒的文章,我会考虑你的加载意见。但我首先想弄清楚为什么我会遇到这个问题。 – 2012-08-14 05:28:33

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); 
}