我有这些实体:
public class Company : PrimaryKey
{
public string Name {get;set;}
public virtual Account Account {get;set;}
}
public class Account
{
[Key]
public Guid CompanyId { get; set; }
public virtual Company Company {get;set;}
}
我使用这些配置:
modelBuilder.Entity<Company>()
.HasOptional(c => c.Account)
.WithRequired(a => a.Company)
.WillCascadeOnDelete();
现在,我有两个项目,一个是一个Console Application
带有 aDbContext
和 a的测试台项目Repository
,第二个是完整的生产项目,MVC 4
我用它Dependancy Injection
来创建一个存储库 .InTransientScope()
,每次它都会加载一个新的上下文叫做。
两者都具有完全相同的上下文和存储库(产品显然具有接口)。
当我调用这个时,在测试台上:
_repository.GetById<Company>(id);
它的所有属性都填写好了,即急切加载
在生产中,当我调用同一行时,什么都没有加载,也没有加载,直到我创建了另一个执行此操作的函数:
_dbContext.Companies.Include("Account").FirstOrDefault(x => x.Id.Equals(id));
其中,执行时确实提供了所有Account
信息,但有趣的是禁止Account
包含任何其他导航属性!!!即使我禁用了 LazyLoading,它仍然无法正常工作。
这是令人惊讶的,因为这两个项目基本相同,禁止在其中一个项目中使用 IoC DI....
为什么会这样?我如何在一个主要是通用的存储库中指定以Controllers
优先加载所有这些信息......?
断点
我在两个项目中都设置了断点,查看了对数据库的 ADO.NET 调用和执行的 sql 语句,在测试台中它确实启动并调用了信息,在生产中它没有显示任何连接或任何东西那种性质的东西。
其他尝试过的东西
从数据库加载导航属性时,我尝试直接访问它:
var acc = _repository.GetById<Company>(id).Account;
它仍然说null
。所以我的存储库/上下文在被要求时甚至没有加载任何相关数据......这是怎么回事?!
定义
_repository.GetById<Company>(id);
是:
public T GetById<T>(Guid id)
{
return _dbContext.Set<T>().FirstOrDefault(x => x.Id.Equals(id));
}