我只是迈出了C#和EF的第一步,并将现有的数据库作为EF数据模型导入到我的Web API项目中。我发现延迟加载已启用,因此我的一些查询非常慢。因此,我希望通过从生成的模型中的导航属性中手动删除“virtual”关键字来禁用它。
据我所知,每次我在db中进行架构更改时,我都需要重新生成整个EF数据模型,这将覆盖我删除虚拟关键字的模型,这意味着我将不得不再次执行。有没有办法配置EF默认禁用延迟加载?我发现了几个与此相关的帖子,例如将它放入我的数据库上下文ctor ..
this.Configuration.LazyLoadingEnabled = false;
但提供的解决方案似乎都没有效果。
答案 0 :(得分:0)
您可以根据自己的喜好修改用于模型生成的T4模板(这些是.tt
文件)。
答案 1 :(得分:0)
我发现延迟加载已启用,因此我的一些查询非常慢。
你确定延迟加载确实是问题吗?通常,延迟加载对查询性能没有影响,但是如果在执行查询后使用它来加载循环中的属性会产生负面影响(N + 1)
并且当然,如果您放置ProxyCreationEnabled = false
,它将停用它。
问题可能不是延迟加载,而是代理的创建。尝试将 PriceSheet.withNewSession {
priceSheetInstance.validate()
// needed to call save in order to check the unique compound key
// validate alone wasn't working
// also needed to wrap withNewSession above
// PriceSheet GORM object implements Serializable as well
// spent way more time than expected on this.... wrestled with Grails
if (priceSheetInstance.hasErrors() || (priceSheetInstance.save(failOnError: true) && priceSheetInstance.hasErrors())) {
respond priceSheetInstance.errors, view:'create'
return
}
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'priceSheet.label', default: 'Price Sheet'), priceSheetInstance?.id])
redirect (action: 'index')
}
'*' { respond priceSheetInstance, [status: CREATED] }
}
}
放入构造函数中并检查它是否更好(它还将禁用延迟加载)。否则,如果您的数据是只读的,您还可以在执行查询时尝试使用AsNoTracking扩展方法。
答案 2 :(得分:0)
在创建ApplicationDbContext
文件的文件夹中,添加一个与.edmx
相同名称的类,并将其标记为部分
公共局部类ApplicationDbContext:DbContext
在该类中添加一个静态方法,该方法将返回您的ApplicationDbContext
对象,如
公共静态ApplicationDbContext Create()
,并在此方法的定义中创建您的ApplicationDbContext
的新对象,并将其LazyLoadingEnabled
设置为false
,就像
var applicationDbContext = new ApplicationDbContext();
applicationDbContext.Configuration.LazyLoadingEnabled = false;
,最后返回新创建的对象。因此,您的局部类的代码将如下所示:
public partial class ApplicationDbContext : DbContext
{
public static ApplicationDbContext Create()
{
var applicationDbContext = new ApplicationDbContext();
applicationDbContext.Configuration.LazyLoadingEnabled = false;
return applicationDbContext;
}
}
并在访问数据库而不是ApplicationDbContext.Create()
的同时在应用程序中使用new ApplicationDbContext()