EF数据库优先:以可持续的方式禁用延迟加载

时间:2015-08-07 12:39:15

标签: c# entity-framework ef-database-first

我只是迈出了C#和EF的第一步,并将现有的数据库作为EF数据模型导入到我的Web API项目中。我发现延迟加载已启用,因此我的一些查询非常慢。因此,我希望通过从生成的模型中的导航属性中手动删除“virtual”关键字来禁用它。

据我所知,每次我在db中进行架构更改时,我都需要重新生成整个EF数据模型,这将覆盖我删除虚拟关键字的模型,这意味着我将不得不再次执行。有没有办法配置EF默认禁用延迟加载?我发现了几个与此相关的帖子,例如将它放入我的数据库上下文ctor ..

this.Configuration.LazyLoadingEnabled = false;

但提供的解决方案似乎都没有效果。

3 个答案:

答案 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()