Winforms 为什么FirstOrDefault调用SaveChanges?

Winforms 为什么FirstOrDefault调用SaveChanges?,winforms,entity-framework-5,Winforms,Entity Framework 5,在下面的代码中,ConfigSetting是一个实体,Db是我的上下文。 当我在调试器中进入下一行时 ConfigSetting config = this.Db.ConfigSettings.FirstOrDefault(o => o.Name == kSiteGuid); 我发现我处于上下文SaveChanges事件中 数据库已存在,因此EF不应尝试为其设定种子 调用堆栈是 SBD.Syrius.DataLayer.dll!SBD.Syrius.DataLayer.Context.

在下面的代码中,ConfigSetting是一个实体,Db是我的上下文。 当我在调试器中进入下一行时

 ConfigSetting config = this.Db.ConfigSettings.FirstOrDefault(o => o.Name == kSiteGuid);
我发现我处于上下文SaveChanges事件中

数据库已存在,因此EF不应尝试为其设定种子

调用堆栈是

SBD.Syrius.DataLayer.dll!SBD.Syrius.DataLayer.Context.SaveChanges()行338 C# EntityFramework.dll!System.Data.Entity.Migrations.DbMigrator.SeedDatabase()+0x9e字节
EntityFramework.dll!System.Data.Entity.Migrations.Infrastructure.MigratorBase.SeedDatabase()+0x40字节
EntityFramework.dll!System.Data.Entity.Migrations.DbMigrator.Upgrade(System.Collections.Generic.IEnumerable pendingMigrations,string targetMigrationId,string lastMigrationId)+0x38c字节
EntityFramework.dll!System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(System.Collections.Generic.IEnumerable pendingMigrations,string targetMigrationId,string lastMigrationId)+0x5e字节
EntityFramework.dll!System.Data.Entity.Migrations.DbMigrator.Update(字符串targetMigration)+0x547字节
EntityFramework.dll!System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()+0x34字节 EntityFramework.dll!System.Data.Entity.MigrateDatabaseToLatestVersion.InitializeDatabase(SBD.Syrius.DataLayer.Context Context)+0xa3字节 EntityFramework.dll!System.Data.Entity.Database.SetInitializerInternal.AnonymousMethod_0(System.Data.Entity.DbContext c)+0xd0字节
EntityFramework.dll!System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization.AnonymousMethod_6()+0x55字节 EntityFramework.dll!System.Data.Entity.Internal.InternalContext.PerforminizationAction(System.Action Action)+0x74字节
EntityFramework.dll!System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()+0x17d字节
EntityFramework.dll!System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase.AnonymousMethod__4(System.Data.Entity.Internal.InternalContext c)+0x30字节
EntityFramework.dll!System.Data.Entity.Internal.RetryAction.PerformAction(System.Data.Entity.Internal.InternalContext输入)+0xa2字节
EntityFramework.dll!System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(System.Action Action)+0x181字节
EntityFramework.dll!System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()+0xa5字节
EntityFramework.dll!System.Data.Entity.Internal.InternalContext.Initialize()+0x46字节
EntityFramework.dll!System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(System.Type entityType)+0x2d字节 EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet.Initialize()+0x97字节
EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet.InternalContext.get()+0x32字节 EntityFramework.dll!System.Data.Entity.Infrastructure.DbQuery.System.Linq.IQueryable.Provider.get()+0x8c字节
System.Core.dll!System.Linq.Queryable.FirstOrDefault(System.Linq.IQueryable源、System.Linq.Expressions.Expression>谓词)+0x55字节
SBD.Syrius.DataLayer.dll!SBD.Syrius.DataLayer.DataHelper.FindOrCreateSite()行262+0x1d6字节C# SBD.Syrius.UI.exe!SBD.Syrius.UI.Program.Main(字符串[]args)行34+0x24字节C# [本机到托管转换]
[管理到本机转换]
mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext ActivationContext,string[]activationCustomData)+0x66字节 Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblydBuginZone()+0x8d字节
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)+0x285字节 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)+0x9字节
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态)+0x57字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()+0x51字节
[本机到托管转换]

调试器显示

'SBD.Syrius.UI.vshost.exe'(托管(v4.0.30319)):加载'E:\EShared\Syrius6\Syrius\u Syrius\SBD.Syrius.UI\bin\Debug\SBD.Syrius.synchronization.dll',加载符号。 System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的第一次意外异常 System.Data.Entity.dll中发生了类型为“System.Data.EntityCommandExecutionException”的首次意外异常 System.Data.Entity.dll中发生了类型为“System.Data.EntityCommandExecutionException”的首次意外异常 System.Data.Entity.dll中发生了类型为“System.Data.EntityCommandExecutionException”的首次意外异常 单步执行:单步执行不带符号的方法“System.Data.Entity.Infrastructure.DbContextInfo.CreateActivator.AnonymousMethod\u0” 单步执行:单步执行不带符号的方法'System.Data.Entity.Infrastructure.DbContextInfo.CreateInstance' 单步执行:单步执行不带符号的方法“System.Data.Entity.Migrations.DbMigrator.SeedDatabase”

[更新]

有关初始值设定项的信息

    private static string _connectionString;

    public Context()
        : base(_connectionString )
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());

    }

    public Context(string connString)
        : base(connString)
    {

        _connectionString = connString;
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());


    }

    public Context(string connString )
        : base(connString)
    {
        _connectionString = connString;

    }
private static string\u connectionString;
公共上下文()
:基本(_连接字符串)
{
Database.SetInitializer(新的MigrateDatabaseTo
namespace SBD.Syrius.DataLayer.Migrations
{

  using System.Data.Entity.Migrations;


  public sealed class Configuration : DbMigrationsConfiguration<SBD.Syrius.DataLayer.Context>
  {
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(SBD.Syrius.DataLayer.Context context)
    {

    }
  }
}
 public virtual void Insert(TEntity entity)
    {
        dbSet.Add(entity);
    }