我有这些实体:
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
,DbContext
和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));
}
答案 0 :(得分:0)
它现在正在工作,我不知道为什么......我没有被任何东西篡改过。我唯一要做的就是将.InTransientScope()
放到IDbContextFactory<MyContext>
我实际上尽可能地启用了所有Lazy Loading,它现在可以正常工作....但是当我开始生产项目时,我甚至从未篡改过Lazy Loading,但是很奇怪Model
并添加了modelBuilder
我不得不专门告诉Lazy Load。