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.动作动作) + 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 source, System.Linq.Expressions.Expression> predicate) + 0x55 bytes
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# [本机到托管转换]
[托管到本机转换]
mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string[] activationCustomData) + 0x66 字节 Microsoft.VisualStudio.HostingProcess.Utilities .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 callback, object state, bool preserveSyncCtx) + 0x9 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x57 字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x51 字节
[原生到托管转换]

调试器显示

'SBD.Syrius.UI.vshost.exe'(托管 (v4.0.30319)):已加载 'E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.UI\bin\Debug\SBD.Syrius.Synchronisation.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.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 回答
0

当我尝试创建新实体时,在我的 UnitOfWork 的 GenericRepository.cs 中调用了此异常。

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

轻松修复

在包管理器控制台中。添加新的迁移Add-Migration SomeMeaninglessName并更新数据库Update-Database

于 2013-11-12T05:33:18.563 回答