【发布时间】:2014-06-17 20:55:22
【问题描述】:
我对实体框架非常陌生,我正在编写的基于 Web api 的站点(连接到 mssql)有问题。我不断收到看似随机的错误(大部分似乎与数据库相关)。这些错误最常发生在网站首次发布时,但有时也会发生在距离上次发布数小时后。错误选择:
- 操作无效。连接已关闭。
- 已经有一个打开的 DataReader 与此命令关联,必须先关闭。
- 连接未关闭。连接的当前状态为正在连接。
- 创建模型时无法查看上下文
- 基础提供程序无法打开
我的上下文如下所示:
public class Context : DbContext
{
public Context() : base("name=DefaultConnection")
{
}
public override int SaveChanges()
{
DateTime now = DateTime.Now;
foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship)
{
IHasUpdated updated = entry.Entity as IHasUpdated;
if (updated != null)
updated.updated = now;
}
}
return base.SaveChanges();
}
public DbSet<Branch> Branches { get; set; }
public DbSet<Company> Companies { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<UsefulLink> UsefulLinks { get; set; }
}
还有比这更多的 DbSet。我应该为每个创建一个单独的上下文吗?
我的一个基本控制器:
public class UsefulLinksController : ApiController
{
private Context db = new Context();
[ResponseType(typeof(UsefulLinksWrapper))]
public IHttpActionResult GetUsefulLinks([FromUri]UsefulLinkParams prams)
{
UsefulLinksWrapper wrapper = new UsefulLinksWrapper();
Meta meta = new Meta();
IQueryable<UsefulLink> query = db.UsefulLinks;
if (prams.sortBy == null)
{
prams.sortBy = "ID";
}
// Paging
query = query.OrderBy(prams.sortBy + " " + prams.sortDirection).Skip(prams.offset - 1).Take(prams.limit);
List<UsefulLink> data = query.ToList();
meta.totalCount = query.Count();
meta.offset = 1;
meta.limit = prams.limit;
wrapper.meta = meta;
wrapper.data = data;
return Ok(wrapper);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool UsefulLinkExists(int id)
{
return db.UsefulLinks.Count(e => e.ID == id) > 0;
}
}
当我在本地运行该网站时,我似乎没有看到这些错误,尽管我们有两个人在它发布时点击了它,所以问题可能源于多个用户?
【问题讨论】:
-
数据库上下文的生命周期是什么?它应该是每个请求。
-
在连接字符串中设置 MultipleActiveResultSets=True 并确保没有单个上下文实例被多个线程访问(如果您在控制器之间共享上下文实例可能会发生这种情况)。
-
@prnjanuario 我不知道!我怎么知道。
-
@GertArnold 不幸的是,添加连接字符串是我尝试的第一件事,它似乎没有任何区别。我的情况和你的情况不同,所以我会确保这不是问题!
-
您应该尽量缩小您的问题范围。尝试找到仍然重现问题的最小代码段。理想情况下,它是如此之小,您可以将其完全张贴在这里 - 如果您在缩小代码的过程中没有找到根本原因。示例:如果您只有一个 DbSet,是否仍然会发生这种情况?如果您使用来自命令行项目而不是 MVC 的实体,会发生这种情况吗? ...
标签: c# entity-framework asp.net-web-api