C# 带有代码的实体框架首先连接到数据库,即使我使用IQueryable
我正在尝试使用现有数据库创建实体框架代码优先场景。 问题是,当我运行程序时,它会尝试连接到数据库,即使我使用C# 带有代码的实体框架首先连接到数据库,即使我使用IQueryable,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我正在尝试使用现有数据库创建实体框架代码优先场景。 问题是,当我运行程序时,它会尝试连接到数据库,即使我使用IQueryable。请阅读我在代码中的注释以了解更多详细信息: static void Main(string[] args) { using (SomeContext db = new SomeContext()) { // This one does not connects to database. // If I disable
IQueryable
。请阅读我在代码中的注释以了解更多详细信息:
static void Main(string[] args)
{
using (SomeContext db = new SomeContext())
{
// This one does not connects to database.
// If I disable my network connection this code will still be executed
IQueryable<Activity> allActivitiesQuery = db.ActivitySet;
// This one does connects to database.
// If I disable my network connection this query will throw exception
IQueryable<Activity> filteredActivitiesQuery = db.ActivitySet
.Where(activity => !string.IsNullOrEmpty(activity.FirstProperty));
}
//If I use same context again it will not connect to database
using (SomeContext db = new SomeContext())
{
//Both statements will be executed even network connection is closed
IQueryable<Activity> allActivitiesQuery = db.ActivitySet;
IQueryable<Activity> filteredActivitiesQuery = db.ActivitySet
.Where(activity => !string.IsNullOrEmpty(activity.FirstProperty));
}
}
static void Main(字符串[]args)
{
使用(SomeContext db=new SomeContext())
{
//这个不连接到数据库。
//如果禁用网络连接,此代码仍将执行
IQueryable allActivitiesQuery=db.ActivitySet;
//这个连接到数据库。
//如果禁用网络连接,此查询将引发异常
IQueryable FilteredActiviesQuery=db.ActivitySet
.Where(activity=>!string.IsNullOrEmpty(activity.FirstProperty));
}
//若我再次使用相同的上下文,它将不会连接到数据库
使用(SomeContext db=new SomeContext())
{
//即使网络连接关闭,这两条语句也将执行
IQueryable allActivitiesQuery=db.ActivitySet;
IQueryable FilteredActiviesQuery=db.ActivitySet
.Where(activity=>!string.IsNullOrEmpty(activity.FirstProperty));
}
}
我如何防止这种行为?当我首先使用数据库并从数据库生成我的模型时,这并没有发生。
当我仅使用IQueryable
时,如何防止对数据库的连接请求
其他详细信息: 如果您需要它们,以下是我的型号:
//model
public class Activity
{
public string FirstProperty { get; set; }
public string SecondProperty { get; set; }
public string ThirdProperty { get; set; }
}
//mapping details
public class ActivityMap : EntityTypeConfiguration<Activity>
{
public ActivityMap()
{
//Primary key
..........
//Properties
.............
//Table & column mappings
.......................
}
}
//Context details
public class SomeContext : DbContext
{
static SomeContext()
{
Database.SetInitializer<SomeContext>(null);
}
public SomeContext()
: base("Name=SomeContext")
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.AutoDetectChangesEnabled = false;
}
public DbSet<Activity> ActivitySet { get; set; }
// Add mapping configuration for code first POCO objects
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ActivityMap());
}
}
//模型
公共课堂活动
{
公共字符串FirstProperty{get;set;}
公共字符串SecondProperty{get;set;}
公共字符串ThirdProperty{get;set;}
}
//映射细节
公共类活动映射:EntityTypeConfiguration
{
公共活动地图()
{
//主键
..........
//性质
.............
//表和列映射
.......................
}
}
//上下文详细信息
公共类SomeContext:DbContext
{
静态SomeContext()
{
Database.SetInitializer(null);
}
公共上下文()
:base(“Name=SomeContext”)
{
this.Configuration.LazyLoadingEnabled=false;
this.Configuration.AutoDetectChangesEnabled=false;
}
公共数据库集活动集{get;set;}
//为代码优先的POCO对象添加映射配置
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
添加(新的ActivityMap());
}
}
除了您的问题外:为什么要在没有工作数据库连接的情况下使用EF/IQueryable
?关于您的问题:EF当时试图执行什么命令?@ChrFin由于性能问题,我不需要它。我会亲自检查的。是否每次都要检查,或者每次都要检查一次?它没有执行任何操作。正在生成查询以获取筛选数据。您遇到了什么异常?@ChrFin“试图对无法访问的网络执行套接字操作”。请阅读我在代码中的注释以了解更多详细信息。除非您尝试枚举数据库(用于循环、ToArray等),否则IQueryable不会连接到数据库。如果它真的试图访问数据库,我猜会有一个被忽略的代码试图实现IQueryable。尝试启用Intellitrace并查看正在执行的sql命令,然后将其返回到启动它的代码。