0

次のコードでは、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、文字列 targetMigrationId、文字列 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(string targetMigration) + 0x547 バイト
EntityFramework.dll!System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update() + 0x34 バイト EntityFramework.dll!System. Data.Entity.MigrateDatabaseToLatestVersion.InitializeDatabase(SBD.Syrius.DataLayer.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.PerformInitializationAction(System.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) + 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 バイト
システム。 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(string[] args) 34 行目+ 0x24バイト C# [ネイティブからマネージドへの移行]
[マネージドからネイティブへの移行]
.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 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 バイト
[Managed Transition にネイティブ]

デバッガーが表示されます

'SBD.Syrius.UI.vshost.exe' (Managed (v4.0.30319)): Loaded 'E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.UI\bin\Debug\SBD.Syrius.Synchronisation.dll',シンボルが読み込まれました。タイプ 'System.Data.SqlClient.SqlException' の最初のチャンスの例外が System.Data.dll で発生しました タイプ 'System.Data.SqlClient.SqlException' の最初のチャンスの例外が System.Data.dll で発生しました'System.Data.SqlClient.SqlException' が System.Data.dll で発生しました タイプ 'System.Data.EntityCommandExecutionException' の最初のチャンスの例外が System.Data.Entity.dll で発生しました タイプ 'System.Data.EntityCommandExecutionException の最初のチャンスの例外' System.Data.Entity.dll で発生しました タイプ 'System.Data.EntityCommandExecutionException' の最初のチャンス例外

[アップデート]

初期化子に関する情報

    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;

    }

構成クラスの場合

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)
    {

    }
  }
}
4

2 に答える 2

0

コール スタックを見ると、データベースの移行が行われていることがわかります。これは、モデルに変更を加え、データベース構造を更新する必要があるときに発生するプロセスです。

移行が行われた後、EF は SeedDatabase を呼び出します。これにより、既定値を追加できます。SeedDatabase の最後で、SaveChanges を呼び出して変更を保存します。

于 2013-10-09T05:32:21.087 に答える