I created a library based on .NET 4.6.2 version.
To the library, I've added the EntityFramework version 6.1.3 package.
I created a model as follow
using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Components.Models { public class Session { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public string Id { get; set; } [Key] [Required] public string Identity { get; set; } [Required] public DateTime CreatedAt { get; set; } [Required] public DateTime UpdatedAt { get; set; } } }
And the dbcontext
using System.Configuration; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using Components.Models; namespace Components.DataContexts { public class SessionContext : DbContext { public SessionContext() : base(ConfigurationManager.ConnectionStrings["sessiondb"].ConnectionString) { } public DbSet<Session> Sessions { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>(); } } }
Then I tried to enable migration and did via
PM> Enable-Migrations
statement, got the error message:
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 D:\C#\IndustryCloud\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1:720 char:5 + $domain.SetData('startUpProject', $startUpProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SerializationException System.NullReferenceException: Object reference not set to an instance of an object. at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetProjectTypes(Project project, Int32 shellVersion) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.IsWebProject(Project project) 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.
What do I doing wrong?
Update Here the structure, how projet is build
In the sessiontest.cs, I wrote the test for db.
[Test] public void InsertARow_DbInitial_ExpectDbValue() { var sn = new Session() { Identity = Random.Generate(15), CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; db.Sessions.Add(sn); db.SaveChanges(); }
The ComponentsTest project, where I wrote the unit test, the app.config looks as follow:
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" /> </connectionStrings> </configuration>
And in the library(Component) itself the app.config:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <add connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Session;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" name="sessiondb" /> </connectionStrings> </configuration>
Other answers suggest this is an issue with your startup project.
As your project is a library, you could try setting your unit test project as your startup project per this answer.
You could also try setting the default project in Package Manager Console to your library project per the accepted answer here.
You might run into issues with where the migrations are created. If you need further control, in EF6 there are various arguments you can use with Enable-Migrations
as detailed in this answer but I don't have enough knowledge in this area to guide you further. You might need to do some reading.
2018 update - if the accepted answer doesn't help, see this github issue on the EF6 repository. Apparently code migration commands don't work with the new project format. In order for the migrations commands to work, you need to create a Class Library (.NET Framework)
project (old standard), move all the files there, add all the needed dependencies and run the command.
EDIT: I just ran into this problem by creating a Class Library (.NET Standard)
project on VisualStudio 2017 15.6.6 using EntityFramework 6.2.0. Creating an "old standard" project as explained above fixes it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With