2013-10-09 49 views
0

在下面的代碼中,ConfigSetting是一個實體,Db是我的上下文。 當我踏進下面一行在我的調試器爲什麼FirstOrDefault調用SaveChanges?

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 bytes
EntityFramework.dll!System.Data.Endity.Migrations.Infrastructure.MigratorBase.SeedDatabase()+ 0x40 bytes
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 bytes
EntityFramework.dll!System.Data.Entity.Migrations .DbMigrator.Update(string targetMigration)+ 0x547 bytes
EntityFramework.dll!System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()+ 0x34 bytes 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!系統.D ata.Entity.Internal.InternalContext.PerformDatabaseInitialization.AnonymousMethod
_6()+ 0x55的字節 EntityFramework.dll!System.Data.Entity.Internal.InternalContext.PerformInitializationAction(System.Action動作)+ 0x74字節
EntityFramework.dll!系統.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()+ 0x17d bytes
EntityFramework.dll!System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase.AnonymousMethod__4(System.Data.Entity.Internal.InternalContext c)+ 0x30 bytes
EntityFramework.dll!System.Data.Entity.Internal.RetryAction.PerformAction(System.Data.Entity.Internal.InternalContext input)+ 0xa2 bytes
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()+ 0×46字節
EntityFramework.dll!System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(的System.Type的EntityType)+ 0x2d字節 EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet。 Initialize()+ 0x97 bytes
EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet.InternalContext.get()+ 0x32 bytes EntityFramework.dll!System.Data.Entity.Infrastructure.DbQuery.System.Linq .IQueryable.Prov ider.get()+ 0x8c bytes
System.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()Line 262 + 0x1d6 bytes C# SBD.Syrius.UI.exe!SBD.Syrius.UI.Program 。主要(字符串[]參數)線34個+ 0X24字節C# [原產於託管過渡]
[託管到純過渡]
mscorlib.dll中!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext,字符串[] activationCustomData)+ 0x66字節 Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()+ 0x8d bytes
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.T hreading.ExecutionContext executionContext,System.Threading.ContextCallback回調,對象狀態,布爾preserveSyncCtx)+ 0x285字節 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback回調,對象狀態,bool preserveSyncCtx)+ 0x9 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state)+ 0x57 bytes
mscorlib.dll!System.Threading .ThreadHelper.ThreadStart()+ 0x51字節
[原產於託管過渡]

調試器顯示

'SBD.Syrius.UI.vshost.exe'(管理(v4.0.30319)):加載「E:\ EShared \ Syrius6 \ syrius_syrius \ SBD.Syrius.UI \ BIN \調試\ 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.Entity.dll中發生第一次機會異常類型'System.Data.EntityCommandExecutionException' 步入:跳過不帶符號的系統的方法。 Data.Entity.Infrastructure.DbContextInfo.CreateActivator.AnonymousMethod__0' 步驟到:步進以上方法沒有符號「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; 

    } 

對於配置類

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

    } 
    } 
} 
信息
+0

可以請你提供調試器嗎? – DevEstacion

+0

完成後,我還禁用了「只是我的代碼」,並能看到調用堆棧 –

+0

您應該顯示您的Application_Start方法,或者無論您在何處配置EF初始化。 –

回答

0

如果您查看調用堆棧,可以看到它正在進行數據庫遷移。這是在對模型進行更改時發生的過程,需要更新數據庫結構。

發生遷移後,EF會調用SeedDatabase,它允許您添加默認值。在SeedDatabase的最後,它調用SaveChanges來保存這些更改。

+0

我同意它看起來像這樣,但是我沒有改變我的模型。如果我在PM中運行Add_migration>創建的遷移沒有代碼。 –

+0

它調用InitializeDatabase。你是否將DbInitializer設置爲null? –

+0

我沒有設置初始化爲空,因爲我想初始化發生如果數據庫已被刪除。 –

0

當我試圖創建一個新的實體時,這個異常在我的UnitOfWork的GenericRepository.cs中被調用。

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

容易解決

在Package Manager控制檯。添加新的遷移Add-Migration SomeMeaninglessName並更新數據庫Update-Database

相關問題