2012-05-13 6 views
5

Estoy creando una base de datos usando Microsoft Entity Framework y CodeFirst en C#. Quiero utilizar la base de datos en una aplicación WPF, por lo que las clases de entidad deben implementar "INotifyPropertyChanged".PostSharp insertando k__Backing Field en Entity Class, causando que la generación de la base de datos falle

Esto se puede hacer muy elegantemente utilizando un aspecto PostSharp, que desencadena automáticamente el evento PropertyChanged cada vez que cambia una propiedad. Si creo un aspecto tan y lo uso en mis clases de entidad, me sale el siguiente excepcion cuando se trata de crear la base de datos:

\tSystem.Data.Entity.Edm.EdmNavigationProperty: Name: The specified name is not allowed:   '<Name>k__BackingField'. 

Obviamente PostSharp crea una propiedad llamada "k__BackingField" que provoca la creación de bases de datos a fallar, porque es un nombre inválido desde el punto de vista de EntityFramework. ¿Hay alguna forma de eludir este error sin implementar manualmente "INotifyPropertyChanged" en cada Entity-Class?

P.S: El inglés no es mi lengua materna, le estaría muy agradecido si me informara sobre posibles errores en mis publicaciones.

gracias de antemano

+0

k__Backingfield no se genera bij postsharp sino por el compilador C# cuando se utiliza una propiedad implementada automáticamente. – albertjan

+0

Eso puede ser cierto, pero si desactivo PostSharp, el error ya no se produce. De alguna manera tiene que haber una relación entre el error y PostSharp. – BoltzmannBrain

+0

¿ha intentado cambiar de una propiedad autoimplementada a una con un campo de respaldo? – albertjan

Respuesta

6

Es cierto que PostSharp puede crear una propiedad denominada k__BackingField (el nombre real es un poco diferente, lo que estamos viendo es el nombre escapa), porque supongo que está aplicando el Aspecto a los campos, que hace que PostSharp encapsule campos en propiedades del mismo nombre. Entonces, puede tener una propiedad nombrada después del campo.

Debe comprobar si realmente desea agregar el aspecto al campo. Tal vez solo quería agregar el aspecto a las propiedades, pero lo está agregando a los campos por error. De forma predeterminada, LocationInterceptionAspects se aplica (multidifusión) a los campos y propiedades. Use MulticastAttributeUsageAttribute.AttributeTargets para restringirlo a las propiedades.

+0

Eso en realidad resolvió mi problema. ¡Muchísimas gracias! – BoltzmannBrain

Cuestiones relacionadas