Pregunta

He editado la pregunta original ya que el mismo error está ocurriendo con la diferencia de la puesta en práctica, ahora se han añadido a la mezcla de Ninject.

He creado una clase para las reglas de validación

public class AlbumValidator : AbstractValidator<Album> {
    public AlbumValidator() {
        RuleFor(a => a.Title).NotEmpty();
    }
}

He creado una ValidatorModule para Ninject

internal class FluentValidatorModule : NinjectModule {
    public override void Load() {
        AssemblyScanner.FindValidatorsInAssemblyContaining<AlbumValidator>()
            .ForEach(result => Bind(result.InterfaceType).To(result.ValidatorType).InSingletonScope());
    }
}

Aquí está mi ValidatorFactory

public class NinjectValidatorFactory : ValidatorFactoryBase {
    public override IValidator CreateInstance(Type validatorType) {
        if (validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) {
            validatorType = Type.GetType(string.Format("{0}.{1}[[{2}]], {3}",
                validatorType.Namespace,
                validatorType.Name,
                validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName,
                validatorType.Assembly.FullName));
        }

        return Container.Get(validatorType) as IValidator;
    }

    IKernel Container { get; set; }
    public NinjectValidatorFactory(IKernel container) {
        Container = container;
    }
}

y las partes pertinentes de mi Global

protected override void OnApplicationStarted() {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(new FluentValidatorModule()); }
    }

Me carga el sitio de ejemplo, haga clic en el enlace crear nuevo álbum y luego haga clic en el botón Crear dejando el título vacía, entonces me da la bienvenida con el error de anulación protected void OnApplicationStarted () {             AreaRegistration.RegisterAllAreas ();             RegisterRoutes (RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(
            new Bootstrapper(),
            new FluentValidatorModule()); }
    }

Me carga el formulario crear y haga clic en Crear dejando el título bajo vacío y he aquí un error

This property cannot be set to a null value.

La línea que hace referencia está dentro de la auto clase Entity Framework generado, Rastreé la

Namespace.Contains("DynamicProxies")

y se vuelve falsa, es porque me dijeron EF utilizar un espacio de nombres personalizado SampleMusicStore.Web?

O me estoy perdiendo algo más?

Saludos.

¿Fue útil?

Solución

El problema es que Entity Framework es la generación de proxies dinámicos en sus clases, y luego el sistema está tratando de validar contra las clases de proxy en lugar de las clases que ha definido.

La manera de resolver esto es lo mismo que esto respuesta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top