2013-10-09 2 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 байт
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, строка lastMigrationId) + 0x38c байты
EntityFramework.dll! System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade (System.Collections.Generic.IEnumerable pendingMigrations, string targetMigrationId, строка 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 контекст) + 0xa3 байт EntityFramework.dll! System.Data.Entity.Database.SetInitializerInternal.AnonymousMethod_ 0 (System.Data.Entity.DbContext с) + 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 байт
EntityFramework.dll! System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase.AnonymousMethod__4 (System.Data.Entity.Internal.InternalContext с) + 0x30 байт
EntityFramework.dll! System.Data.Entity.Internal.RetryAction.PerformAction (System.Data.Entity.Internal.InternalContext input) + 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. Инициализировать() + 0x97 байт
EntityFramework.dll! System.Data.Entity.Internal.Linq.InternalSet.InternalContext.get() + 0x32 байта EntityFramework.dll! System.Data.Entity.Infrastructure.DbQuery.System.Linq .IQueryable.Prov ider.get() + 0x8c байты
System.Core.dll! System.Linq.Queryable.FirstOrDefault (источник System.Linq.IQueryable, System.Linq.Expressions.Выражение> предикат) + 0x55 байт
SBD.Syrius.DataLayer.dll! SBD.Syrius.DataLayer.DataHelper.FindOrCreateSite() Строка 262 + 0x1d6 байт C# SBD.Syrius.UI.exe! SBD.Syrius.UI.Program .Главный (строка [] арг) Строка 34 + 0x24 байт C# [Род Managed Перехода]
[Успели Native Перехода]
mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext, строка [] activationCustomData) + 0x66 байт Microsoft.VisualStudio.HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x8d байт
mscorlib.dll! System.Threading.ExecutionContext.RunInternal (System.T hreading.ExecutionContext executeContext, System.Threading.ContextCallback callback, состояние объекта, bool preserveSyncCtx) + 0x285 байт mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executeContext, System.Threading.ContextCallback callback, состояние объекта , 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' (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.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; 

    } 

Для класса Configuration

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

Я согласен, что это похоже, однако я не внес изменений в свою модель. Если я запускаю Add_migration в PM>, у созданного переноса нет кода. –

+0

Это вызов InitializeDatabase. Вы установили DbInitializer в значение null? –

+0

Я не установил инициализатор в нуль, потому что я хочу, чтобы инициализация произошла, если база данных была удалена. –

0

Это исключение было вызвано в GenericRepository.cs для моего UnitOfWork, когда я попытался создать новый объект.

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

Easy Fix

В Package Manager Console. Добавьте новую миграцию Add-Migration SomeMeaninglessName и обновите базу данных Update-Database.

Смежные вопросы