entity framework – 在创建模型时不能使用上下文

我正在尝试创建一个控制台应用程序,我试图使用Entity Framework动态创建数据库和表来存储数据。 但是,当我尝试将数据添加到我的DbSet 。 我收到以下错误。

EntityFramework.dll中发生了未处理的“System.InvalidOperationException”类型exception

附加信息:创建模型时无法使用上下文。 如果在OnModelCreating方法内部使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此exception。 请注意,DbContext和相关类的实例成员不保证是线程安全的。

我已经提到了其他类似错误的post,但没有一个解决方案有效。 这是一个单线程应用程序。

错误发生在行

 this.context.Environments.Add(entity) 

DataSource.cs

 public class DataSource { private static DataSource instance; public DataSource() { this.context = new CounterContext(); } public static DataSource Instance { get { return instance ?? (instance = new DataSource()); } } private CounterContext context; public void AddCockpitEnvironmentDetails(IList environmentList) { foreach (var entity in environmentList) { this.context.Environments.Add(entity); } this.context.SaveChanges(); } ... } 

我的背景:

 public class CounterContext : DbContext { public CounterContext() : base("name=CounterDbString") { Database.SetInitializer(new CreateDatabaseIfNotExists()); } public DbSet CounterDetails { get; set; } public DbSet Environments { get; set; } } 

模型

 public class Environment { [Key] public Guid Id { get; set; } public string EnvironmentName { get; set; } public string EnvironmentNotes { get; set; } public virtual ICollection CounterDetails { get; set; } }; public class CounterData { [Key] [Column(Order = 1)] public DateTime counterTime { get; set; } [Key] [Column(Order = 2)] public int counterName { get; set; } [Key] [Column(Order = 3)] public Guid EnvId {get; set;} public int count { get; set; } [ForeignKey("EnvId")] public virtual CockpitEnvironment Machine { get; set; } } 

App.config

    

使用VS2015,我在调试时收到此错误(F5)。 只需停止调试器并重新启动问题就消失了。

如果在尚未创建数据库时出现这种情况,则通常是连接字符串问题或数据库初始化程序问题。 您的连接字符串看起来没问题,因此它可能在实例构造函数中具有初始化程序。 尝试将初始化程序移动到静态构造函数 :

 public class CounterContext : DbContext { static CounterContext // runs once { Database.SetInitializer(new CreateDatabaseIfNotExists()); } public CounterContext() : base("name=CounterDbString") { } public DbSet CounterDetails { get; set; } public DbSet Environments { get; set; } } 

这对我有用:在创建上下文后初始化数据库

 context.Database.Initialize(force: false);