entity framework - tabla - Agregar documentación al código generado en el modelo de infraestructura de entidad primero
migraciones entity framework (1)
He estado utilizando el modelo Entity Framework primero desde VS 2010. Cuando construyo mi proyecto, EF genera un archivo Model.Designer.cs que contiene todas las entidades. Este archivo de diseñador también contiene la documentación agregada a las entidades en el archivo EDMX.
Cuando creé un nuevo primer modelo de EF en VS 2012, se agrega un archivo Model.tt a mi archivo EDMX. Esta plantilla T4 genera un único archivo para cada entidad en mi modelo. Desafortunadamente, la documentación del archivo EDMX no se usa en el código generado.
Me gusta mucho tener mi modelo documentado para que IntelliSense se muestre al usarlo. La única solución que he encontrado hasta ahora es eliminar el Model.tt y los archivos de clase generados y volver a activar la generación de código en mi archivo EDMX. Esto revierte al comportamiento que utilizo desde VS 2010. Sin embargo, preferiría tener un archivo separado por entidad.
¿Hay alguna manera (preferiblemente utilizando herramientas VS y sin tener que modificar ningún archivo que se envía con VS) de incluir la documentación del archivo EDMX en los archivos de clase única generados?
Editar: Para ilustrar mejor mi problema, aquí hay un ejemplo rápido.
Digamos que mi modelo se ve así:
He resaltado la parte donde ingresé la documentación en la ventana Propiedades de la propiedad Id.
Así es como se ve la entidad en el archivo EDMX:
<EntityType Name="Entity1">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" >
<Documentation>
<Summary>This is documentation for the ID property.</Summary>
</Documentation>
</Property>
</EntityType>
La clase generada (Entity1.cs) por Model.tt se ve así:
public partial class Entity1
{
public int Id { get; set; }
}
Pero cuando enciendo la generación de código para mi modelo, esta es la apariencia de la entidad en Model.Designer.cs:
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="Model1", Name="Entity1")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Entity1 : EntityObject
{
#region Factory Method
/// <summary>
/// Create a new Entity1 object.
/// </summary>
/// <param name="id">Initial value of the Id property.</param>
public static Entity1 CreateEntity1(global::System.Int32 id)
{
Entity1 entity1 = new Entity1();
entity1.Id = id;
return entity1;
}
#endregion
#region Simple Properties
/// <summary>
/// This is documentation for the ID property.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 Id
{
get
{
return _Id;
}
set
{
if (_Id != value)
{
OnIdChanging(value);
ReportPropertyChanging("Id");
_Id = StructuralObject.SetValidValue(value, "Id");
ReportPropertyChanged("Id");
OnIdChanged();
}
}
}
private global::System.Int32 _Id;
partial void OnIdChanging(global::System.Int32 value);
partial void OnIdChanged();
#endregion
}
Así lo ves: Model.Designer.cs contiene mi cadena de documentación personalizada "Esta es la documentación de la propiedad de ID". mientras que Entity1.cs no lo hace. Sin embargo, Model.Designer.cs puede ser bastante grande si hay muchas entidades y la depuración en este archivo es algo lenta. Preferiría tener varios archivos pequeños (uno por entidad), pero aún así conservar la documentación del archivo EDMX en el código generado.
Creo que deberás modificar el archivo T4. Tengo el mismo problema y leí un poco el archivo T4 e intenté seguir las instrucciones aquí: http://karlz.net/blog/index.php/2010/01/16/xml-comments-for- marco de la entidad/
Sin embargo, estamos usando VS 2012 y las instrucciones no parecen funcionar al 100%. Terminé cambiando el código de generación de propiedades al final del archivo T4 y funciona exactamente como quería que fuera. Los cambios están en CodeStringGenerator.Property () y CodeStringGenerator.NavigationProperty ()
public string Property(EdmProperty edmProperty)
{
string doc = "";
if (edmProperty.Documentation != null)
{
doc = string.Format(
CultureInfo.InvariantCulture,
"/n/t/t/// <summary>/n/t/t/// {0} - {1}/n/t/t/// </summary>/n/t/t",
edmProperty.Documentation.Summary ?? "",
edmProperty.Documentation.LongDescription ?? "");
}
return doc + 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)));
}
public string NavigationProperty(NavigationProperty navigationProperty)
{
var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType());
string doc = "";
if (navigationProperty.Documentation != null)
{
doc = string.Format(
CultureInfo.InvariantCulture,
"/n/t/t/// <summary>/n/t/t/// {0} - {1}/n/t/t/// </summary>/n/t/t",
navigationProperty.Documentation.Summary ?? "",
navigationProperty.Documentation.LongDescription ?? "");
}
return doc + string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)),
navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navigationProperty),
_code.SpaceAfter(Accessibility.ForGetter(navigationProperty)),
_code.SpaceAfter(Accessibility.ForSetter(navigationProperty)));
}
Tenga en cuenta que no funcionará con la documentación de la clase, por lo que debe hacer algo como esto con entidad y tipo complejo
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#if (!ReferenceEquals(entity.Documentation, null))
{
#>
/// <summary>
/// <#=entity.Documentation.Summary#> – <#=entity.Documentation.LongDescription#>
/// </summary>
<#}#>
<#=codeStringGenerator.EntityClassOpening(entity)#>