我得到了一个非常奇怪的Cast Exception。例外情况非常罕见。
这是代码:
protected Guid GetWebsiteLanguage(Guid websiteId, int languageId)
{
Guid websiteLanguagesId = Guid.Empty;
var websites = from item in DataContext.WebsiteLanguages
where item.WebsiteId == websiteId && item.LanguageId == languageId
select item.Id;
if (websites.Count() != 1)
throw new ArgumentException("Wrong channel parameters.");
try
{
websiteLanguagesId = websites.First();
}
catch (Exception ex)
{
string errorMessage = websites.First() == null ? "websites.First() is null" : string.Concat("Invalid Guid ", websites.First().ToString());
throw new Exception(string.Concat(ex.Message, " - Log: ", errorMessage, " - Variables: websiteId = ", websiteId.ToString(), " languageId = ", languageId));
}
return websiteLanguagesId;
}
我得到的例外是:
指定演员无效。 - 记录:
Guid无效ef058612-37db-4b02-aa13-5a528819a5e0
变量: websiteId = db725f45-70fa-4fd0-b344-55bbf17a5c15
languageId = 2057
这是catch的异常输出。正如你所看到的,我们有一个GUID,但他仍在给出一个演员异常...
有时它在这个函数的Count()上出错了。那么这就是stacktrace:
System.Data.Linq.IExecuteResult执行(System.Linq.Expressions.Expression,QueryInfo,System.Data.Linq.SqlClient.IObjectReaderFactory,System.Object [],System.Object [],System.Data.Linq。 SqlClient.ICompiledSubQuery [],System.Object)STACKTRACE:at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query,QueryInfo queryInfo,IObjectReaderFactory factory,Object [] parentArgs,Object [] userArgs,ICompiledSubQuery [] subQueries,Object的lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query,QueryInfo [] queryInfos,IObjectReaderFactory factory,Object [] userArguments,ICompiledSubQuery [] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
在System.Data.Linq.DataQuery 1.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Count[TSource](IQueryable
1来源)
在GetWebsiteLanguage(Guid websiteId,Int32 languageId)
当发生这种情况时,唯一的解决方案是执行iis应用程序池回收并再次运行。
有什么想法吗?
这就是我处理datacontext的方式
public MyDataContext DataContext
{
get
{
//Changed this to make this testable with unit tests
if (HttpContext.Current != null)
{
if (!HttpContext.Current.Items.Contains(DataContextKey))
HttpContext.Current.Items.Add(DataContextKey, new MyDataContext(ConnectionString));
return (MyDataContext)HttpContext.Current.Items[DataContextKey];
}
else
{
//When context is not available
if (context == null)
context = new MyDataContext(ConnectionString);
return context;
}
}
}
答案 0 :(得分:1)
好吧,我不确定导致问题的原因。但我理解你,但是只有一个结果?所以你考虑过根本不使用Count。另外你的代码后半部分的First()也不能为null。
(如果您可以有多个结果,请改用FirstOrDefault)
那么为什么不重构使用SingleOrDefault()。:
var websites = (from item in DataContext.WebsiteLanguages
where item.WebsiteId == websiteId && item.LanguageId == languageId
select item.Id).SingleOrDefault();
并继续
if (websites == null)
throw new ArgumentException("Wrong channel parameters.");
答案 1 :(得分:0)
我遇到了同样的问题,并通过在我的DBML中将Server Data Type
属性设置为uniqueidentifier
来解决它。