我想提高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; }
答案 0 :(得分:1)
模板正在尝试实例化您的DbContext以生成视图。它使用默认的ctor。但是在您的情况下,默认的ctor使用_dbConnection
变量,该变量永远不会在应用程序域中初始化正在运行转换,因此将具有空值,从而导致从基数抛出ArgumentNullException
的DbContext。
请注意,此处的问题实际上是您尝试使用的模式。我不认为拥有一个DbConnection实例或DbContext实例是个好主意。您应该按需创建DbContext / DbConnection实例。请注意,DbContext不是线程安全的。您还应该避免长时间使用DbContext实例并倾向于工作单元模式,在该模式中您创建上下文以执行特定操作并在完成后丢弃实例。您可以在此处阅读有关静态DbConnection的更多信息:SqlConnection Thread-Safe?,可能还有更多地方。