Код будет работать нормально, если только вы используете Count()
только один раз за время существования вашего приложения.И ошибка означает именно то, что говорится.Если вы посмотрите на код CompiledQuery
:
private object ExecuteQuery(DataContext context, object[] args) {
if (context == null) {
throw Error.ArgumentNull("context");
}
if (this.compiled == null) {
lock (this) {
if (this.compiled == null) {
this.compiled = context.Provider.Compile(this.query);
this.mappingSource = context.Mapping.MappingSource;
}
}
}
else {
if (context.Mapping.MappingSource != this.mappingSource)
throw Error.QueryWasCompiledForDifferentMappingSource();
}
return this.compiled.Execute(context.Provider, args).ReturnValue;
}
Вы можете увидеть, что он делает, он фактически компилирует запрос только при первом вызове.Он также сохраняет ссылку на ваш DataContext.Mapping.MappingSource
и гарантирует, что вы используете один и тот же MappingSource
для каждого последующего вызова.
По умолчанию каждый раз, когда вы создаете новый DataContext
, новый MappingSource
создан вместе.Это делается в конструкторе, и позже невозможно переопределить его, поскольку свойства DataContext.Mapping
и MetaModel.MappingSource
имеют только открытый метод получения.Однако существует перегрузка конструктора DataContext
, которая принимает MappingSource
в качестве аргумента, который (удачи вам) позволяет вам повторно использовать один источник сопоставления в течение всего жизненного цикла вашего приложения.
Не уверен, чтоточные конструкторы вашего ServiceCustomContext
класса, но следующий код должен дать вам подсказку решения, чтобы предотвратить возникновение ошибки:
public class ServiceCustomContext : DataContext
{
private static readonly MappingSource mappingSource = new AttributeMappingSource();
public ServiceCustomContext(string connection) : base(connection, mappingSource)
{
}
}
Я предполагал, что вы используете атрибуты для объявления отображения, однако выможно использовать XmlMappingSource
в случае, если вы используете XML-файл для сопоставления вашей базы данных.