私は、私たちのプロジェクトの1つでコード分析を実行しましたが、次の警告メッセージが表示されたら少し驚きました。DataContextとコード分析メッセージを廃棄する
CA2000:Microsoft.Reliability: 'DataImport.ImportSalesExecBackFill(Stream)'メソッドでは、すべての参照が有効範囲外になる前に、System.IDisposable.Disposeオブジェクト 'dc'を呼び出します。
コードの次の部分を参照してください。
using (DataDataContext dc = new DataDataContext(ConfigurationManager.ConnectionStrings["data"].ConnectionString))
{
List<tableSale> sample = (from s in dc.tableSales
where bfData.Select(d => d.RegNo).ToList().Contains(s.RegNum)
select s).ToList();
var matches = (from s in sample
join bfd in bfData on s.RegNum equals bfd.RegNo
where string.IsNullOrEmpty(s.OpDesc)
select new { UserId = s.UserID, OpId = String.Format("SMMT{0}-{1}", s.DlrNo, bfd.OpName), OpDesc = bfd.OpName }).ToList();
List<tableSale> updQuery = (from s in dc.tableSales
where matches.Select(d => d.UserId).ToList().Contains(s.UserID)
select s).ToList();
foreach (tableSale rec in updQuery)
{
rec.OpID = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpId).First();
rec.OpDesc = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpDesc).First();
}
dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
using (PCSalesDataContext pcdc = new PCSalesDataContext(ConfigurationManager.ConnectionStrings["LatData"].ConnectionString))
{
List<tblSale> upd700 = (from s in pcdc.tblSales
where matches.Select(d => d.UserId).ToList().Contains(s.UserID)
select s).ToList();
foreach (tblSale rec in upd700)
{
rec.OpID = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpId).First();
rec.OpDesc = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpDesc).First();
}
pcdc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
result = true;
}
私はdatacontextが常にusingステートメントのスコープの終わりに配置されるという印象を受けました。私は何かを逃していますか、これは私が喜んで無視することができる警告メッセージですか?
恐らくバグだと思うが、私はあなたの使い方については間違いないと思う。 – leppie