2016-09-14 2 views
2

Я пишу, работая с базой данных, которая была предварительно обработана, и что я создал определения DBSet для таблиц. Текущая база данных была унаследована от предыдущей системы и содержит более 100 000 строк данных в таблице (транзакции более 5 лет). Мы помещаем это в новое приложение, перенося данные.База данных уже создана, новые таблицы не добавляются в

Итак, база данных была создана вручную, а не код в первую очередь. Новые классы - это код в первую очередь, и мы надеемся, что эти таблицы будут автоматически генерироваться в таблицу.

Я проверил, и у пользователя есть доступ к базе данных, которую мы используем для доступа к базе данных. База данных также не находится в ReadOnly.

Ниже класс Context, который был создан:

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using BHI.WCMS.DAL; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity.Infrastructure; 
using System.Data.Entity.Migrations; 


namespace BHI.WCMS.DAL.Partner 
{ 
    public class PartnerContext : DbContext 
    { 
     public PartnerContext() 
      : base("partner") 
     { 
      //Configuration.LazyLoadingEnabled = false; 
      Database.SetInitializer<PartnerContext>(new MigrateDatabaseToLatestVersion<PartnerContext, PartnerConfiguration>()); 
     } 

     public PartnerContext(string ConnectionStringName) 
      : base(ConnectionStringName) 
     { 
     } 

     //protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     //{ 
     // modelBuilder.Entity<PartnerProfileServiceCenterTransaction>().Property(p => p.AmountDue).HasPrecision(8, 2); 
     // base.OnModelCreating(modelBuilder); 
     //} 

     public DbSet<WarrantyForms> WarrantyForms { get; set; } 
     public DbSet<WarrantyFormLines> WarrantyFormLines { get; set; } 
     public DbSet<WarrantyFormLineParts> WarrantyFormLineParts { get; set; } 
     public DbSet<WarrantyFormLineReplacements> WarrantyFormLineReplacements { get; set; } 
     public DbSet<PartnerProfile> PartnerProfiles { get; set; } 
     public DbSet<PartnerProfileContactInfo> PartnerProfileContactInfos { get; set; } 
     public DbSet<PartnerProfileCustomerAddress> PartnerProfileCustomerAddresses { get; set; } 
     public DbSet<PartnerProfileServiceCenterTransaction> PartnerProfileServiceCenterTransactions { get; set; } 

     public static PartnerProfile InsertPartnerProfile(PartnerProfile profile) 
     { 
      using (var db = new PartnerContext()) 
      { 
       foreach (var addy in profile.BillingAddress) 
       { 
        addy.DateCreated = DateTime.Now; 
        addy.DateModified = DateTime.Now; 
        db.PartnerProfileCustomerAddresses.Add(addy); 
        db.SaveChanges(); 
       } 

       //profile.DateCreated = DateTime.Now; 
       //profile.DateModified = DateTime.Now; 
       //db.PartnerProfiles.Add(profile); 
       //db.SaveChanges(); 
      } 
      return profile; 
     } // end of public static PartnerProfile InsertPartnerProfile(PartnerProfile profile) 

     public static PartnerProfile UpdatePartnerProfile(PartnerProfile profile) 
     { 
      using (var db = new PartnerContext()) 
      { 

      } 
      return profile; 
     } // end of public static PartnerProfile UpdatePartnerProfile(PartnerProfile profile) 

     public static PartnerProfile SelectPartnerProfile(PartnerProfile profile) 
     { 
      using (var db = new BHI.WCMS.DAL.Partner.PartnerContext()) 
      { 

      } 
      return profile; 
     } // end of public static PartnerProfile SelectPartnerProfile(PartnerProfile profile) 

    }  // end of class WarrantyContext : DbContext 

    internal sealed class PartnerConfiguration : DbMigrationsConfiguration<PartnerContext> 
    { 
     public PartnerConfiguration() 
     { 
      AutomaticMigrationsEnabled = true; 
     } 
    } 
}   // end of namespace BHI.WCMS.DAL.Partner 

Я посмотрел на добавление конфигурации за другие статьи

и что не работал. Я также попытался запустить это Enable-Migrations -ContextTypeName BHI.WCMS.DAL.Partner.PartnerContext -EnableAutomaticMigrations

И это тоже не сработало. Когда я изменяю Контекст от Партнера к Журналированию (база данных, которая была 100% -ным кодом сначала), она загружает таблицы без проблем. Таким образом, это приводит меня сделать следующие предположения:

  1. Существует не проблема с файлами классы определения таблиц
  2. Существует не проблема с файлом DbContext, который ссылающиеся файлами
  3. Поскольку Я могу получить данные из базы данных для старых таблиц, нет проблемы с именем пользователя/паролем для базы данных.
  4. Поскольку учетная запись пользователя имеет доступ к db_owner, не должно быть никаких проблем с базой данных.

Все, что сказано, я смотрю на это и не могу заставить таблицы создавать. Таким образом, в тех таблицах, которые там есть, что-то не так, или проблема с самой базой данных (таблица __MigrationHistory отсутствует).

Сообщение об ошибке я получаю это:

Exception: System.Data.Entity.Infrastructure.DbUpdateException 
    Message: An error occurred while updating the entries. See the inner exception for details. 
    Source: EntityFramework 
     at System.Data.Entity.Internal.InternalContext.SaveChanges() 
     at BHI.WCMS.DAL.Partner.WarrantyContext.InsertPartnerProfile(PartnerProfile profile) in c:\inetpub\Bissell SiteCore\Dev\Partners-Dev\BHI.WCMS\BHI.WCMS.DAL\Partner\WarrantyContext.cs:line 47 
     at BHI.WCMS.ECommerce.BWS.Partner.MapServiceToObject(ServiceCenterResponse response) in c:\inetpub\Bissell SiteCore\Dev\Partners-Dev\BHI.WCMS\BHI.WCMS.ECommerce.BWS\Partner.cs:line 151 
     at BHI.WCMS.ECommerce.BWS.Partner.BWSGetServiceCenterInfo(String accountNumber, String zipCode) in c:\inetpub\Bissell SiteCore\Dev\Partners-Dev\BHI.WCMS\BHI.WCMS.ECommerce.BWS\Partner.cs:line 48 

    Nested Exception 

    Exception: System.Data.Entity.Core.UpdateException 
    Message: An error occurred while updating the entries. See the inner exception for details. 
    Source: EntityFramework 
     at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() 
     at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
     at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction) 
     at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
     at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction) 
     at System.Data.Entity.Internal.InternalContext.SaveChanges() 

    Nested Exception 

    Exception: System.Data.SqlClient.SqlException 
    Message: Invalid object name 'dbo.PartnerProfileCustomerAddresses'. 
    Source: .Net SqlClient Data Provider 
     at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
     at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
     at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
     at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 
     at System.Data.SqlClient.SqlDataReader.get_MetaData() 
     at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
     at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 
     at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
     at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
     at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
     at Glimpse.Ado.AlternateType.GlimpseDbCommand.ExecuteDbDataReader(CommandBehavior behavior) 
     at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
     at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) 
     at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues) 
     at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() 

Любая помощь по этому вопросу было бы весьма признателен.

Благодаря Роберт

ответ

0

Хорошо, в работе с одним из парней здесь, мы смогли выяснить, что происходит.

  1. Это возможно, чтобы создать базу данных, а затем позволить ей создавать больше таблиц в этой созданной вручную базе данных (это то, что мы делали в таблице ведения журнала).
  2. Проблема была связана не с тем, что контекст был неправильным, но мое плохое внимание к деталям.

На моих классов сущностей была закодирована неправильно (и я не перепутались с ним в течение года, чтобы заметить)

Неправильная версия

public partial class WarrantyFormLineReplacements 
{ 
    #region Class Variables 
    public int in_WFLineReplacementID; 
    public int in_WFlineId; 
    public int in_WFId; 
    [MaxLength(120)] 
    public string vc_ModelNumber; 
    public decimal dc_ReplacementCost; 
    [MaxLength(255)] 
    public string vc_InsertBy; 
    public DateTime dt_InsertDate; 
    [MaxLength(255)] 
    public string vc_UpdateBy; 
    public DateTime dt_UpdateDate; 
    #endregion 
}  // end of public partial class WarrantyFormLineReplacements 

исправленная версия

public partial class WarrantyFormLineReplacements 
{ 
    #region Class Variables 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int in_WFLineReplacementID {get;set;} 
    public int in_WFlineId { get; set; } 
    public int in_WFId { get; set; } 
    [MaxLength(120)] 
    public string vc_ModelNumber { get; set; } 
    public decimal dc_ReplacementCost { get; set; } 
    [MaxLength(255)] 
    public string vc_InsertBy { get; set; } 
    public DateTime dt_InsertDate { get; set; } 
    [MaxLength(255)] 
    public string vc_UpdateBy { get; set; } 
    public DateTime dt_UpdateDate { get; set; } 
    #endregion 
}  // end of public partial class WarrantyFormLineReplacements 

Основные проблемы, которые я вызвал

Основные проблемы: у меня не было ключа (который пытался поймать и зарегистрировать ловушку), и когда я добавил ключ, у меня не было методов accessor/mutator, определенных для каждая переменная ({get; задавать;}). Как только я добавил их, он создал таблицы без каких-либо проблем в уже созданную базу данных. Он также создал таблицу __MigrationHistory, как я ожидал.

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