EF异常‘在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。 请注意不保证 DbContext 的实例成员’
2017-01-16 19:12
746 查看
一、EF的线程安全问题
1.在使用EF是经常会抛出这样的异常
其他信息: 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。
请注意不保证 DbContext 的实例成员和相关类是线程安全的。
2.说明
1.在使用EF时很多时候不能对上线文进行单例处理,也不能将上线文设置为static类型
2.如果对于使用上线文对象不太注意就会出现,多线程的如上异常。
3.官方给出的上线文的线程安全说明:此类型的任何公共 static成员都是线程安全的。但不保证所有实例成员都是线程安全的。
二、解决方案:
1.在写代码时特别注意:同一个上下文实例,不在多个线程中使用
2.在有等待代码操作,或定时器,或夹杂其他长时间执行代码的循环语句中注意:在这样特殊执行操作代码中,每次使用上下文都重新创建对象
3.在特殊循环操作中,重新创建对象,对于查询可以及时获取数据库更新到的数据。
举例说明一:同一个上下文实例,不在多个线程中使用
1.抛出异常的代码段
MenuOperate _menu = new MenuOperate();
ModuleOperate _module = new ModuleOperate();
Action update1 = () =>
{
_menu.UpdateFirstName(Count.ToString());
_module.UpdateFirstName(Count.ToString());
Console.WriteLine(_menu.GetFirstName());
Console.WriteLine(_module.GetFirstName());
Count++;
};
for (int i = 0; i < 3; i++)
{
Task.Factory.StartNew(update1); //启动线程访问数据库操作
}2.解决方案的代码段
Action<object> update1 = (number) =>
{
while (true)
{
//将上线文实例放在本线程中创建
MenuOperate _menu = new MenuOperate();
ModuleOperate _module = new ModuleOperate();
_menu.UpdateFirstName(Count.ToString());
_module.UpdateFirstName(Count.ToString());
Console.WriteLine("-------");
Console.WriteLine(_menu.GetFirstName());
Console.WriteLine(_module.GetFirstName());
Count++;
Thread.Sleep(1000 * Convert.ToInt32(number));
}
};
for (int i = 0; i < 3; i++)
{
Task.Factory.StartNew(update1, i + 1);
}
举例说明二:在这样特殊执行操作代码中,每次使用上下文都重新创建对象
特别说明:此处在每一次循环中都重现创建上下文
//显示菜单
Task.Factory.StartNew(() =>
{
while (true)
{
MenuOperate _menu = new MenuOperate();
string menuname = _menu.GetFirstName();
Console.WriteLine($"---时间:{DateTime.Now.ToLongTimeString()},菜单名称:{menuname}");
Thread.Sleep(1000);
}
});
//显示模块
Task.Factory.StartNew(() =>
{
while (true)
{
ModuleOperate _menu = new ModuleOperate();
string name = _menu.GetFirstName();
Console.WriteLine($"***时间:{DateTime.Now.ToLongTimeString()},模块名称:{name}");
Thread.Sleep(1000);
}
});
更多:
EntiryFramework中事务操作(三)事务回滚数据模型和数据库不对应问题
EF,‘正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线
EF中Sum()异常:到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。
1.在使用EF是经常会抛出这样的异常
其他信息: 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。
请注意不保证 DbContext 的实例成员和相关类是线程安全的。
2.说明
1.在使用EF时很多时候不能对上线文进行单例处理,也不能将上线文设置为static类型
2.如果对于使用上线文对象不太注意就会出现,多线程的如上异常。
3.官方给出的上线文的线程安全说明:此类型的任何公共 static成员都是线程安全的。但不保证所有实例成员都是线程安全的。
二、解决方案:
1.在写代码时特别注意:同一个上下文实例,不在多个线程中使用
2.在有等待代码操作,或定时器,或夹杂其他长时间执行代码的循环语句中注意:在这样特殊执行操作代码中,每次使用上下文都重新创建对象
3.在特殊循环操作中,重新创建对象,对于查询可以及时获取数据库更新到的数据。
举例说明一:同一个上下文实例,不在多个线程中使用
1.抛出异常的代码段
MenuOperate _menu = new MenuOperate();
ModuleOperate _module = new ModuleOperate();
Action update1 = () =>
{
_menu.UpdateFirstName(Count.ToString());
_module.UpdateFirstName(Count.ToString());
Console.WriteLine(_menu.GetFirstName());
Console.WriteLine(_module.GetFirstName());
Count++;
};
for (int i = 0; i < 3; i++)
{
Task.Factory.StartNew(update1); //启动线程访问数据库操作
}2.解决方案的代码段
Action<object> update1 = (number) =>
{
while (true)
{
//将上线文实例放在本线程中创建
MenuOperate _menu = new MenuOperate();
ModuleOperate _module = new ModuleOperate();
_menu.UpdateFirstName(Count.ToString());
_module.UpdateFirstName(Count.ToString());
Console.WriteLine("-------");
Console.WriteLine(_menu.GetFirstName());
Console.WriteLine(_module.GetFirstName());
Count++;
Thread.Sleep(1000 * Convert.ToInt32(number));
}
};
for (int i = 0; i < 3; i++)
{
Task.Factory.StartNew(update1, i + 1);
}
举例说明二:在这样特殊执行操作代码中,每次使用上下文都重新创建对象
特别说明:此处在每一次循环中都重现创建上下文
//显示菜单
Task.Factory.StartNew(() =>
{
while (true)
{
MenuOperate _menu = new MenuOperate();
string menuname = _menu.GetFirstName();
Console.WriteLine($"---时间:{DateTime.Now.ToLongTimeString()},菜单名称:{menuname}");
Thread.Sleep(1000);
}
});
//显示模块
Task.Factory.StartNew(() =>
{
while (true)
{
ModuleOperate _menu = new ModuleOperate();
string name = _menu.GetFirstName();
Console.WriteLine($"***时间:{DateTime.Now.ToLongTimeString()},模块名称:{name}");
Thread.Sleep(1000);
}
});
更多:
EntiryFramework中事务操作(三)事务回滚数据模型和数据库不对应问题
EF,‘正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线
EF中Sum()异常:到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。
相关文章推荐
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- 正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不
- 您可能无法使用服务器管理器,如果两个线程同时访问 IIS 管理 IIS 的修补程序
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- 同时创建多个线程,它们都访问一个对象中的同步方法,怎么确保第一个线程最先拿到对象锁,否则,怎么保证多个线程之间的有序通信
- 使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库
- 【Java面试题】42 TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- EF 保证线程内唯一 上下文的创建
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型
- WPF中使用Free解决访问非UI线程创建的对象抛出的Thread异常
- Yii中Model(模型)的创建及使用方法
- 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法
- c#中Invoke使用方法(线程间操作无效: 从不是创建控件的线程访问它。那么创建它的线程是哪个线程?)
- 领域建模有很多种方法,对于同样的问题域使用不同的建模手段得到的模型可能也不尽相同。于是我经常听到这样一个问题:怎么才能保证建模的正确性?
- 懒人的方法处理: 从不是创建控件XXX的线程访问的异常
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- 保证EF上下文实例是线程内唯一
- Yii中Model(模型)的创建及使用方法