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);