实体框架 - 在创建模型时无法使用上下文 [英] Entity Framework - The context cannot be used while the model is being created

查看:448
本文介绍了实体框架 - 在创建模型时无法使用上下文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


在EntityFramework.dll中发生类型System.InvalidOperationException
的未处理异常p>

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


我已经提到其他帖子同样的错误,但没有一个解决方案工作。这是一个单线程应用程序。



错误发生在

  this.context.Environments。添加(实体)

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

私人CounterContext上下文;

public void AddCockpitEnvironmentDetails(IList< Environment> environmentList)
{
foreach(environmentList中的var entity)
{
this.context.Environments.Add (实体);
}

this.context.SaveChanges();
}
...
}

我的上下文: / p>

  public class CounterContext:DbContext 
{
public CounterContext()
:base = CounterDbString)
{
Database.SetInitializer< CounterContext>(new CreateDatabaseIfNotExists< CounterContext>());
}
public DbSet< CounterData> CounterDetails {get;组; }

public DbSet< Environment>环境{get;组;
}

模型

  public class Environment 
{
[Key]
public Guid Id {get;组; }
public string EnvironmentName {get;组; }
public string EnvironmentNotes {get;组; }

public virtual ICollection< CounterDetail> CounterDetails {get;组; }
};

public class CounterData
{
[Key]
[Column(Order = 1)]
public DateTime counterTime {get;组;
[Key]
[Column(Order = 2)]
public int counterName {get;组;
[Key]
[Column(Order = 3)]
public Guid EnvId {get; set;}
public int count {get;组; }

[ForeignKey(EnvId)]
public virtual CockpitEnvironment Machine {get;组; }
}

App.config

 < connectionStrings> 
< add name =CounterDbString
connectionString =Data Source = .\SQLEXPRESS; Initial Catalog = Counters_Test; Integrated Security = True; Connect Timeout = 30
providerName =System .Data.SqlClient/>
< / connectionStrings>


解决方案

使用VS2015,调试时收到此错误F5)。简单地停止调试器并重新启动后,问题就会消失。


I am trying to create a console application where I am trying to use Entity Framework to dynamically create database and tables to store the data. However, when I am trying to add data to my DbSet. I am getting the following error.

An unhandled exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll

Additional information: The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.

I have referred to other posts with similar error but none of the solutions worked. This is a single threaded application.

The error occurs at line

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<Environment> environmentList)
        {
            foreach (var entity in environmentList)
            {
                this.context.Environments.Add(entity);
            }

            this.context.SaveChanges();
        }
...
}

My context:

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

        public DbSet<Environment> Environments { get; set; }
    }

Model

public class Environment
{
    [Key]
    public Guid Id { get; set; }
    public string EnvironmentName { get; set; }
    public string EnvironmentNotes { get; set; }

    public virtual ICollection<CounterDetail> 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:

<connectionStrings>
    <add name="CounterDbString" 
         connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Counters_Test;Integrated Security=True;Connect Timeout=30"
         providerName="System.Data.SqlClient"/>
</connectionStrings>

解决方案

Using VS2015, I was getting this error when debugging (F5). After simply stopping the debugger and restarting the problem went away.

这篇关于实体框架 - 在创建模型时无法使用上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆