¿Hay alguna forma de agregar atributos personalizados a las propiedades en el código generado por EF? Lo único que puedo ver como una solución plausible sería crear una plantilla T4 personalizada. Sin embargo, debido a la naturaleza del atributo, sería imposible determinar el parámetro de atributo correcto por propiedad de EF.Agregar atributos de propiedad personalizados en el código de Entity Framework
Respuesta
Puede hacer esto especificando un tipo de metadato que refleje las propiedades y se use simplemente para la atribución.
[MetadataType(typeof(Dinner_Validation))]
public partial class Dinner
{}
public class Dinner_Validation
{
[Required]
public string Title { get; set; }
}
Steve Smith blogs sobre él here.
Desafortunadamente, el enfoque anterior es frágil para la refactorización. Otra opción es usar las nuevas entidades POCO. Estos evitan la generación de código en tiempo de compilación por lo que yo sé. No los he usado todavía así que no puedo comentar sobre ningún inconveniente o desventaja.
No creo que puedas. El generador declara todas las clases como parciales, lo que le permite extenderlo, pero no le permitirá marcar propiedades con atributos personalizados, ya que simplemente generará sobre ellos. Lo único que puedes hacer es escribir tus propias entidades.
Esto puede haber sido el caso, pero hay un par de opciones hoy en día. Ver mi respuesta para obtener información. –
Puede crear la interfaz y declarar el atributo en la interfaz.
partial class Person : IPerson {}
public interface IPerson
{
[Required]
string Name { get; set; }
}
Como nota al margen para futuros lectores, esto * no * funciona con la validación de asp.net-mvc. –
Puede añadir esto a archivo EDMX, con el diseñador también:
<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
<Documentation>
<Summary>[MyCustomAttribute]</Summary>
</Documentation>
</Property>
y reemplazar T4:
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
WriteProperty(Accessibility.ForProperty(edmProperty),
code.Escape(edmProperty.TypeUsage),
code.Escape(edmProperty),
code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
Con:
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
if(edmProperty.Documentation != null && string.IsNullOrWhiteSpace(edmProperty.Documentation.Summary) == false)
{
#>
<#=edmProperty.Documentation.Summary#>
<#+
}
WriteProperty(Accessibility.ForProperty(edmProperty),
code.Escape(edmProperty.TypeUsage),
code.Escape(edmProperty),
code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
puede agregar a este al archivo EDMX, con Designer también:
<Property Name="Nome" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" >
<Documentation>
<Summary>[MyCustomAttribute]</Summary>
</Documentation>
</Property>
y reemplazar T4:
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
WriteProperty(Accessibility.ForProperty(edmProperty),
code.Escape(edmProperty.TypeUsage),
code.Escape(edmProperty),
code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
Con:
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{
if(edmProperty.Documentation != null && string.IsNullOrWhiteSpace(edmProperty.Documentation.Summary) == false)
{
#>
<#=edmProperty.Documentation.Summary#>
<#+
}
WriteProperty(Accessibility.ForProperty(edmProperty),
code.Escape(edmProperty.TypeUsage),
code.Escape(edmProperty),
code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
Y para Entity Framework 6, reemplace
public string Property(EdmProperty edmProperty)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
con
public string Property(EdmProperty edmProperty)
{
var description = String.Empty;
bool isAttribute = false;
if(edmProperty.Documentation != null &&
string.IsNullOrWhiteSpace(edmProperty.Documentation.Summary) == false)
{
string summary = edmProperty.Documentation.Summary;
if (!String.IsNullOrEmpty(summary) && summary.First() == '[' && summary.Last() == ']')
{
isAttribute = true;
}
if (isAttribute)
{
description = String.Format("\r\n\t{0}\r\n\t", summary);
}
else
{
description = String.Format("\r\n\t/// <summary>\r\n\t/// {0}\r\n\t/// </summary>\r\n\t",
summary);
}
}
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)),
description);
}
Advertencias:
- espacios de nombres deben resolverse absolutamente.
- Asume que los atributos comienzan con '[' y terminan con ']' - no hay otro error que compruebe
- Si no se encuentra un parlante de apertura y cierre, el resumen de la propiedad del marco de la entidad se envuelve en un comentario de triple barra XML.
- Intenta hacer coincidir la información de estilo de estudio visual predeterminada (realmente solo sangrías) que puede o no ser el caso para su proyecto. Esto incluye nuevas líneas.salida
muestra:
/// <summary>
/// content type
/// </summary>
public System.Guid ContentType { get; set; }
[System.ComponentModel.DisplayName("Last Modified")]
public System.DateTime LastModified { get; set; }
Además de la respuesta de BurnsBA, aplicar esto a las propiedades de navegación también, actualizar NavigationProperty()
así:
public string NavigationProperty(NavigationProperty navProp)
{
var description = String.Empty;
if(navProp.Documentation != null && string.IsNullOrWhiteSpace(navProp.Documentation.Summary) == false)
{
string summary = navProp.Documentation.Summary;
if (!String.IsNullOrEmpty(summary) && summary.First() == '[' && summary.Last() == ']')
{
description = String.Format("\r\n\t{0}\r\n\t", summary);
}
else
{
description = String.Format("\r\n\t/// <summary>\r\n\t/// {0}\r\n\t/// </summary>\r\n\t", summary);
}
}
var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType());
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)),
navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navProp),
_code.SpaceAfter(Accessibility.ForGetter(navProp)),
_code.SpaceAfter(Accessibility.ForSetter(navProp)),
description);
}
Lo utilizo para añadir [Newtonsoft.Json.JsonIgnore]
a mi propiedades.
Nota: Hay que añadir estos a <...>Model.tt
y no <...>Model.Context.tt
- 1. Entity Framework - Agregar propiedad de navegación manualmente
- 2. Agregar una propiedad personalizada a Entity Framework?
- 3. Código Entity Framework Primero - Nombre de Columna de Propiedad Virtual
- 4. Nette Framework - macros de atributos personalizados
- 5. Entity Framework CTP5, primer código. propiedad de navegación opcional
- 6. ¿Agregar atributos personalizados usando mono.cecil?
- 7. Cómo agregar el prefijo de tabla en el código de Entity Framework primero a nivel mundial?
- 8. código de proyección repetida en Entity Framework
- 9. Cómo mapear la propiedad de suma (como TotalPrice) en el código de Entity Framework Primero
- 10. Obtener atributos personalizados de Expresión de propiedad Lambda
- 11. ¿Cómo agregar documentación a los atributos personalizados?
- 12. Agregar atributos personalizados al control asp.NET RadioButton
- 13. Patrones personalizados de Resharper: Ignorar atributos de propiedad
- 14. Código Entity Framework First ReadOnly Entity
- 15. Rellenar propiedad niño con Entity Framework SQLQuery
- 16. ¿Cómo agregar tabla en Entity Framework?
- 17. Agregar atributos personalizados al componente de autocompletado Primefaces en JSF
- 18. obteniendo la consulta de Entity Framework para respetar los atributos
- 19. Código de Entity Framework primero para Oracle
- 20. Atributos personalizados en ActionResult
- 21. Código de Entity Framework First IQueryable
- 22. Cómo ignorar una propiedad al utilizar el código de Entity Framework First
- 23. Multiplactiveresultsets en Entity Framework 4.1 Código Primero
- 24. Establecer propiedad de modelo a booleano en Entity Framework
- 25. Validación de Entity Framework
- 26. Entity Framework Código CTP4 Primero: Asignación de propiedades protegidas
- 27. Código Entity Framework Primera clave de solo lectura
- 28. Atributos personalizados en Android
- 29. Entity Framework - Aprovechando nombre de propiedad de primera letra
- 30. Entity Framework POCO - Actualizar una propiedad de navegación
Me acababa de enamorar de EF cuando de repente me di cuenta de que los atributos en mis entidades serían prácticamente inexistentes debido a la forma en que se manejan. Grrrr. – Chev
Al reflejar, 'assembly.GetType (typeof (Dinner) .ToString(). GetProperties()', 'property.Attributes' es nulo y' property.GetCustomAttributes (typeof (RequiredAttribute)) 'devuelve una matriz de longitud cero - should uno refleja Dinner_Validation o es algo diferente? – lukiffer