c# - net - web api exception handling best practice
VS 2015 ASP.NET Web API(EF6) y Xamarin Enable-Migrations falla (2)
Estoy desarrollando un proyecto que utilizará la API web de ASP.NET como servicio de datos y una aplicación portátil de Xamarin como cliente.
Estoy intentando habilitar las migraciones en la aplicación web, pero recibo el siguiente error:
Enable-Migrations -enableautomaticmigrations -ContextTypeName MyProject.Models.ApplicationDbContext -ProjectName MyProject -StartupProjectName MyProject.App -Verbose
Using StartUp project ''MyProject.App''.
Exception calling "SetData" with "2" argument(s): "Type ''Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'' in assembly
''Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'' is not marked as serializable."
At C:/Users/weitz/.nuget/packages/EntityFramework/6.1.3/tools/EntityFramework.psm1:718 char:5
+ $domain.SetData(''project'', $project)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SerializationException
Exception calling "SetData" with "2" argument(s): "Type ''Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject'' in assembly
''Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'' is not marked as serializable."
At C:/Users/weitz/.nuget/packages/EntityFramework/6.1.3/tools/EntityFramework.psm1:719 char:5
+ $domain.SetData(''contextProject'', $contextProject)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SerializationException
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetPropertyValue[T](Project project, String propertyName)
at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory)
at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName)
at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Object reference not set to an instance of an object.
**PM>**
Como puede ver, he intentado especificar el proyecto de inicio explícitamente pero no parece que el comando enable-migrations esté tan contento con él.
Es un proyecto que acabo de crear y que usa .NET completo (estoy vinculado al modelo TPT / TPH que EF Core aún no admite), por lo que la versión de EF es 6.1.3 dirigida a .NET 4.6.1.
Estoy en VS Community 2015 Update 3 Version 14.0.25431.01.
Actualizar
No se puede reproducir, pero el problema ocurre incluso cuando se agrega un proyecto de inicio ficticio.
Edita el número publicado here , vota y comparte tus experimentos.
Bueno, de acuerdo con this (probado y funciona), la única forma de habilitar las migraciones en el proyecto aspnetcore + ef6, es tener la implementación DbContext
en una biblioteca de clases .NET completa externa, además de agregar un proyecto de inicio ficticio.
Chupa pero trabaja.
Parece que se queja del Using StartUp project ''MyProject.App''
pero ya ha especificado el nombre del proyecto de inicio con -StartupProjectName MyProject.App
Puedes probar solo:
Enable-Migrations -enableautomaticmigrations -ContextTypeName MyProject.Models.ApplicationDbContext -ProjectName MyProject -StartupProjectName MyProject.App -Verbose
Asegúrese de que en su archivo de configuración del proyecto de inicio tenga una cadena de conexión válida (a menos que especifique un nombre de cadena de conexión en el constructor DbContext, su cadena de conexión debería llamarse ApplicationDbContext, como su DbContext, si recuerdo bien)
ACTUALIZACIÓN Subestimé el problema. Parece que podría no ser cómo se especifica el proyecto de inicio, sino el proyecto de inicio en sí. Sugiero mirar esta respuesta . Preste especial atención, como decía antes, que la cadena de conexión existe en la web o app.config en el proyecto de inicio y tiene el nombre correcto.