У меня странные проблемы с кодом, сгенерированным с помощью netTiers. Я попытался использовать инфраструктуру, предоставленную в простой форме, для сохранения информации об одном из созданных объектов.
Вот метод, который я вызываю со страницы ASPX:
public void UpdateSupplier(Object sender, EventArgs e)
{
// Update Supplier name and code from update form
supplier.Name = txtName.Text;
supplier.Code = txtCode.Text;
// Save the Changes - Exception happens on next line!
PPGEDI.Data.DataRepository.SuppliersEntityEntityProvider.Save(supplier);
// Reload the information from the database to display
ReLoadInformation();
}
Когда я вызываю этот метод нажатием кнопки на странице aspx, я получаю следующую информацию об исключении:
Ошибка сервера в «/» приложении.
Не удалось найти файл конфигурации entlib.config.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Exception Details: System.IO.FileNotFoundException: The configuration file entlib.config could not be found.
Source Error:
Line 190: public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults)
Line 191: {
Line 192: Validator validator = new ValidationIntegrationHelper(this).GetValidator();
Line 193:
Line 194: if (validator != null)
Source File: PPGEDI.Entities\Validation\PropertyValidator.cs Line: 192
Stack Trace:
[FileNotFoundException: The configuration file entlib.config could not be found.]
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource.GetRootedCurrentConfigurationFile(String configurationFile) +221
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource..ctor(String configurationFilepath, Boolean refresh, Int32 refreshInterval) +45
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource..ctor(String configurationFilepath, Boolean refresh) +48
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource..ctor(String configurationFilepath) +39
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSourceElement.CreateSource() +64
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceFactory.Create(String name) +355
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceFactory.Create() +96
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.CreateDefaultContainer() +25
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.SetCurrentContainerIfNotSet() +84
Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.get_Current() +22
Microsoft.Practices.EnterpriseLibrary.Validation.ValidationFactory.get_DefaultCompositeValidatorFactory() +25
Microsoft.Practices.EnterpriseLibrary.Validation.PropertyValidationFactory.GetPropertyValidatorFromAttributes(Type type, PropertyInfo propertyInfo, String ruleset, MemberAccessValidatorBuilderFactory memberAccessValidatorBuilderFactory) +166
Microsoft.Practices.EnterpriseLibrary.Validation.PropertyValidationFactory.GetPropertyValidator(Type type, PropertyInfo propertyInfo, String ruleset, ValidationSpecificationSource validationSpecificationSource, MemberAccessValidatorBuilderFactory memberAccessValidatorBuilderFactory) +264
Microsoft.Practices.EnterpriseLibrary.Validation.PropertyValidationFactory.GetPropertyValidator(Type type, PropertyInfo propertyInfo, String ruleset, ValidationSpecificationSource validationSpecificationSource, MemberValueAccessBuilder memberValueAccessBuilder) +71
Microsoft.Practices.EnterpriseLibrary.Validation.Integration.ValidationIntegrationHelper.GetValidator() +106
PPGEDI.Entities.Validation.PropertyValidator.DoValidate(Object objectToValidate, Object currentTarget, String key, ValidationResults validationResults) in PPGEDI.Entities\Validation\PropertyValidator.cs:192
Microsoft.Practices.EnterpriseLibrary.Validation.Validator.Validate(Object target) +80
PPGEDI.Entities.EntityBaseCore.Validate(String propertyName) in PPGEDI.Entities\EntityBaseCore.generated.cs:477
PPGEDI.Entities.EntityBaseCore.OnPropertyChanged(PropertyChangedEventArgs e) in PPGEDI.Entities\EntityBaseCore.generated.cs:342
PPGEDI.Entities.EntityBaseCore.OnPropertyChanged(String propertyName) in PPGEDI.Entities\EntityBaseCore.generated.cs:329
PPGEDI.Entities.SuppliersEntityBase.set_Name(String value) in SuppliersEntityBase.generated.cs:279
PPGEDI.Supplier.Supplier_Main_Config.UpdateSupplier(Object sender, EventArgs e) in Supplier_Main_Config.aspx.cs:29
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.225
Кажется, что следующий метод вызывает исключение:
/// <summary>
/// Does the validate.
/// </summary>
/// <param name="objectToValidate">The object to validate.</param>
/// <param name="currentTarget">The current target.</param>
/// <param name="key">The key.</param>
/// <param name="validationResults">The validation results.</param>
public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults)
{
// Exception Error on next line!!!
Validator validator = new ValidationIntegrationHelper(this).GetValidator();
if (validator != null)
{
ValidationResults results = validator.Validate(this);
if (!results.IsValid)
{
validationResults.AddAllResults(results);
}
}
}
Теперь вот самая странная вещь. Я ставлю точки останова, чтобы проследить и найти проблему. Я нажал F5 в своем браузере, и не было ошибки исключения. После некоторых проб и ошибок, я обнаружил, что я получаю эту ошибку исключения каждый раз, когда я отправляю форму, но если я нажимаю F5, она повторно отправляется нормально без ошибок, и обновление происходит в базе данных. Был бы очень признателен, если бы кто-то мог посоветовать, почему это происходит и что я могу сделать, чтобы исправить эту ошибку. Файл entlib.config действительно находится в проекте, он также был сгенерирован, и я убедился, что он действительно существует.
Информация о EntLib, который вызывается с помощью ValidationIntegrationHelper:
Assembly Microsoft.Practices.EnterpriseLibrary.Validation.dll, v2.0.50727
ОБНОВЛЕНИЕ: Я до сих пор не смог понять, как это исправить, поэтому я сделал ужасную вещь, я поместил блок try / catch вокруг кода в DoValidate, чтобы он не взорвался , Мне нужно было, чтобы это не сломалось, пока клиенты его используют, но мне все еще нужно выяснить, почему он это делает, и исправить это, вместо того, чтобы игнорировать это, прежде чем мы начнем работу. Если он просто обрабатывает проверку, то я могу игнорировать ее, потому что я проверяю на лицевой стороне перед сохранением или обновлением сущностей.