gpt4 book ai didi

c# - 延迟加载-( Entity Framework )底层连接意外关闭

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:11 25 4
gpt4 key购买 nike

我正在尝试使用 Entity 框架实现延迟加载。我会提前承认我从来没有这样做过并且正在努力。所以我尝试的一切都是基于我在这里找到的文章。基本上我现在收到底层连接意外关闭错误消息。

当我执行 WCF 跟踪时,它表明在尝试序列化参数 http://tempuri.org...Consider 时出现错误如果您正在使用 DataContractSerializer 或将任何静态未知类型添加到已知类型列表中,则使用 DataContractResolver。

因此,我研究了 DataContractResolver,但不清楚如何实现它,也不清楚我如何知道我是否在使用 DataContractSerializer。就像我说的,我是新手。

这是我当前的代码:

 public OMBCase GetOMBCaseByCaseId(long caseId)
{
//using (AWCTSDBEntities context = new AWCTSDBEntities())
AWCTSDBEntities context = new AWCTSDBEntities();
//{
try
{
context.Configuration.ProxyCreationEnabled = true;
context.Configuration.LazyLoadingEnabled = true;
context.Configuration.AutoDetectChangesEnabled = false;

((IObjectContextAdapter)context).ObjectContext.CommandTimeout = 120;
context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

var caseRecQuery = (from c in context.Cases
where (c.CaseId == caseId && c.SystemTypeCode == SystemCodes.OMB)
select c).OfType<OMBCase>();

var caseRecord = caseRecQuery.Single();
var soldierDetails = caseRecord.Soldier;
var soldierAddress = soldierDetails.Addresses.ToList();
foreach (var p in soldierDetails.Addresses)
{
var soldierAddressPurpose = p.AddressPurposes;
foreach (var ap in soldierAddressPurpose)
{
var purpose = ap;
}
}
var soldierTelehone = soldierDetails.Telephones.ToList();
var soldierEmail = soldierDetails.Emails.ToList();
var soldierContacts = soldierDetails.Contacts.ToList();
foreach (var ca in soldierDetails.Contacts)
{
var contactAddress = ca.Addresses;
foreach (var cp in contactAddress)
{
var contactAddressPurposes = cp.AddressPurposes;
}
}
foreach (var ce in soldierDetails.Contacts)
{
var contactEmails = ce.Emails;
}
foreach (var ct in soldierDetails.Contacts)
{
var contactTelephone = ct.Telephones;
}
var personInterviewed = caseRecord.PersonInterviewed;
var createdByUser = caseRecord.CreatedByUser;
context.Dispose();
return (caseRecord);
//
}
catch (NullReferenceException)
{
context.Dispose();
return (null);
}
catch (Exception e)
{
context.Dispose();
WriteToLogFile(e);
return (null);
// }
}


}

如果您能提供任何有关如何从这里开始的指导,我们将不胜感激。

在此先感谢您提供的任何帮助。

罗德尼

最佳答案

在请求实际值之前,“延迟加载”不会填充您的任何类。这也意味着当 context 超出范围(或被处置)时,查询中的对象是不好的。

看起来您的程序正在执行此操作:

Logic logic logic; // Logic before getting case
var case = GetOMBCaseByCaseId(caseid);
Logic logic logic; // Logic performed on case

延迟加载最适合这样的场景,在上下文超出范围之前执行逻辑:

ProcessOMBCaseByCaseId(Int32 caseid)
{
using (AWCTSDBEntities context = new AWCTSDBEntities())
{
var caseRecQuery = (from c in context.Cases
where (c.CaseId == caseId && c.SystemTypeCode == SystemCodes.OMB)
select c).OfType<OMBCase>();

Logic logic logic; // Logic performed on case
}
}

关于c# - 延迟加载-( Entity Framework )底层连接意外关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com