EF6 Code First为c#预生成的视图

时间:2014-03-17 10:19:06

标签: c# entity-framework ef-code-first

我想提高EF6的性能。所以我为c#添加了模板EF6 Code First预生成视图。运行我的模板时出现此错误

  

错误18正在运行转换:   System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。 ---> System.ArgumentNullException:   值不能为空。参数名称:existingConnection at   System.Data.Entity.Utilities.Check.NotNull [T](T值,字符串   System.Data.Entity.DbContext..ctor(DbConnection   existingConnection,Boolean contextOwnsConnection)at   AccountingCore.DomainEntities.DatabaseContext..ctor()in   c:\ Users \ wassel \ Desktop \ Tay_Entreprise \ Migrated Taysir \ Taysir   Entreprise \ AccountingCore \ DomainEntities \ DatabaseContext.cs:第26行   ---内部异常堆栈跟踪结束---在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值)   publicOnly,Boolean noCheck,Boolean& canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔& bNeedSecurityCheck)at   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean   skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark)at   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,   Boolean skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark)
  在System.Activator.CreateInstance(Type type,Boolean nonPublic)at   System.Activator.CreateInstance(Type type)at   Microsoft.VisualStudio.TextTemplating083B3A1F42B3A6F6984D21F93E2A562F18834A2D2CD4017C917BCF44C5B4413C639EC8000C24911B33CCC0A1B86BE1DE019321BC7BEBB9B61319B229A38834A7.GeneratedTextTransformation.GetEdmx(大会   efAssembly,输入contextType)at   Microsoft.VisualStudio.TextTemplating083B3A1F42B3A6F6984D21F93E2A562F18834A2D2CD4017C917BCF44C5B4413C639EC8000C24911B33CCC0A1B86BE1DE019321BC7BEBB9B61319B229A38834A7.GeneratedTextTransformation.TransformText()

这是我的上下文类

public class DatabaseContext : DbContext 
    {
        private static DatabaseContext instance;
        public static DatabaseContext Instance
        {
            get
            {
                return instance;
            }
        }
        private static DbConnection _dbConnection;
        public DatabaseContext() : base(_dbConnection,false)
        {
        }

        public static void InitialiseInstance(DbConnection connection)
        {
            if (instance != null)
            {
                instance.Dispose();
                GC.SuppressFinalize(instance);
            }
            instance = new DatabaseContext(connection);
        }

        public DatabaseContext(DbConnection connection)
            : base(connection,true)
        {
            Database.SetInitializer<DatabaseContext>(new DatabaseInitialiser());

        }

        public DbSet<class1> c1{ get; set; }

1 个答案:

答案 0 :(得分:1)

模板正在尝试实例化您的DbContext以生成视图。它使用默认的ctor。但是在您的情况下,默认的ctor使用_dbConnection变量,该变量永远不会在应用程序域中初始化正在运行转换,因此将具有空值,从而导致从基数抛出ArgumentNullException的DbContext。

请注意,此处的问题实际上是您尝试使用的模式。我不认为拥有一个DbConnection实例或DbContext实例是个好主意。您应该按需创建DbContext / DbConnection实例。请注意,DbContext不是线程安全的。您还应该避免长时间使用DbContext实例并倾向于工作单元模式,在该模式中您创建上下文以执行特定操作并在完成后丢弃实例。您可以在此处阅读有关静态DbConnection的更多信息:SqlConnection Thread-Safe?,可能还有更多地方。