我正在尝试使用Entity Framework - Repository模式。(Asp.net C#,EF4)
我为每个数据库表创建存储库。但是当我连接表时,会出现错误,提示:“指定的LINQ表达式包含与不同上下文相关联的查询引用。”
为避免出现错误消息,我将所有内容放入一个类中,如下所示:
这是测试的控制器,
然后,另一个错误发生了。
我认为它试图进行两次处理,但我不知道如何修复代码... 有人知道吗,请给我建议~ 谢谢
我为每个数据库表创建存储库。但是当我连接表时,会出现错误,提示:“指定的LINQ表达式包含与不同上下文相关联的查询引用。”
为避免出现错误消息,我将所有内容放入一个类中,如下所示:
public class WebOrderRepository
{
private DbEntities context = new DbEntities(); //Web.config <add name="DBEntities" connectionString=" ...
public IQueryable<WEBORDERHD> WebOrderHds
{
get { return context.WEBORDERHDs; }
}
public IQueryable<WEBORDERLN> WebOrderLns
{
get { return context.WEBORDERLNs; }
}
}
你能帮我审阅一下我的代码吗?
这是我的存储库类:
public class Repository : IDisposable
{
protected ShkAdsEntities context;
private bool _disposed;
public Repository()
{
context = new ShkAdsEntities();
}
public void Dispose() //If define this class as Static then, 'Dispose': cannot declare instance members in a static class
{
DisposeObject(true);
GC.SuppressFinalize(this);
}
~Repository()
{
DisposeObject(false);
}
private void DisposeObject(bool disposing)
{
if (_disposed)
{
return;
}
if(disposing){
if (context != null)
{
context.Dispose();
}
_disposed = true;
}
}
}
public class WebOrderHdRepository : Repository
{
public IQueryable<WEBORDERHD> WebOrderHds
{
get { return context.WEBORDERHDs; }
}
public void Create(WEBORDERHD obj)
{
}
public void Delete(WEBORDERHD ojb)
{
}
public void SubmitChanges()
{
context.SaveChanges();
}
}
public class WebOrderLnRepository : Repository
{
public IQueryable<WEBORDERLN> WebOrderLns
{
get { return context.WEBORDERLNs; }
}
public void Create(WEBORDERLN obj)
{
}
public void Delete(WEBORDERLN ojb)
{
}
public void SubmitChanges()
{
context.SaveChanges();
}
}
这是测试的控制器,
[HttpGet]
public ActionResult repositoryTest()
{
WebOrderHdRepository webOrderHdRepository = new WebOrderHdRepository();
WebOrderLnRepository webOrderLnRepository = new WebOrderLnRepository();
var result = (from x in webOrderHdRepository.WebOrderHds
join u in webOrderLnRepository.WebOrderLns on x.OrderNo equals u.OrderNo
select new {x.OrderNo}).SingleOrDefault();
return Content(result.OrderNo);
}
我尝试将上下文定义为静态的,并与IT技术相关联。
protected static ShkAdsEntities context = null;
public Repository()
{
if (context == null)
{
context = new ShkAdsEntities();
}
}
然后,另一个错误发生了。
Sequence contains more than one element
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: Sequence contains more than one element
Source Error:
Line 116: {
Line 117: WebOrderHdRepository webOrderHdRepository = new WebOrderHdRepository();
Line 118: WebOrderLnRepository webOrderLnRepository = new WebOrderLnRepository(); <== ERROR POINT
Line 119:
Line 120: var result = (from x in webOrderHdRepository.WebOrderHds
我搜索了很多实体框架-仓储模式的资料,但大部分都非常复杂。因此,我希望像上面那样简化它。
请给我建议~
谢谢!
[编辑]
我尝试了这个,
using(WebOrderHdRepository webOrderHdRepository = new WebOrderHdRepository())
using (WebOrderLnRepository webOrderLnRepository = new WebOrderLnRepository())
{
.
.
但是出现了一个错误。
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ObjectDisposedException: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
Source Error:
Line 114: {
Line 115: using(WebOrderHdRepository webOrderHdRepository = new WebOrderHdRepository())
Line 116: using (WebOrderLnRepository webOrderLnRepository = new WebOrderLnRepository())
Line 117: {
Line 118:
我认为它试图进行两次处理,但我不知道如何修复代码... 有人知道吗,请给我建议~ 谢谢