2011-12-31 14 views
5

¿Cómo puedo agregar anotaciones/atributos a mis clases o métodos de clases en mi modelo, generados desde mi archivo Model.edmx? La razón por la que estoy preguntando esto es porque cada vez que agrego una anotación a una clase Model.Designer.cs, esta anotación desaparece cuando hago cambios en mi archivo Model.edmx a través del diseñador.MVC Model from EDMX file - Agregue anotaciones personalizadas y haga que permanezcan?

Más específicamente, yo estoy buscando una manera de añadir la anotación AllowHtml a una propiedad específica dentro de una de mis clases del modelo, y hacer que permanecer allí incluso después de jugar un poco con él en la vista del diseñador del modelo.

Aquí está el código del controlador. La propiedad Contenido de la clase Segmento es la que causa el bloqueo de mi controlador cuando se rellena con HTML.

[FacebookAuthorize(Permissions = AuthenticationController.ExtendedPermissions, LoginUrl = "/Authentication/LogOn?ReturnUrl=~/Segment/Contribute")] 
    [HttpPost] 
    [ValidateInput(false)] 
    public ActionResult Contribute(int id, string content) 
    { 

     var container = new ModelContainer(); 

     var parent = container.SegmentSet.SingleOrDefault(s => s.Id == id); 

     var segment = new Segment(); 
     segment.Content = content; //this crashes with HTML data. 
     segment.Owner = AuthenticationController.Authentication.GetUser(container); 
     segment.TimeModified = DateTime.UtcNow; 
     segment.TimePosted = DateTime.UtcNow; 

     container.AddToSegmentSet(segment); 

     if (!parent.Children.Contains(segment)) 
     { 
      parent.Children.Add(segment); 
      segment.Parent = parent; 
     } 

     container.SaveChanges(); 

     return RedirectToAction("Index", "Home"); 
    } 

Respuesta

14

Puede utilizar MetadataTypeAttribute para extender sus clases:

[MetadataType(typeof(MyEdmxClassExtension))] 
public partial class MyEdmxClass { } 

public class MyEdmxClassExension 
{ 
    [AllowHtml] // Add the attributes you want to find on your property 
    public string ThePropertyYouWantToExtend { get; set; } 
} 

Este código va en un archivo separado que el generado o se perderá, también, por supuesto.

Editar

En respuesta a los comentarios de abajo, creo que usted tiene dos preguntas. Su pregunta original se responde usando el MetadataTypeAttribute y, por el segundo, probablemente debería abrir otra pregunta.

+1

¡Guau, esa es una característica realmente genial! ¡Gracias! –

+0

Ningún problema en absoluto. –

+0

Excepto por el hecho de que no funciona. Mi controlador todavía se cuelga cuando recibe datos HTML. ¿Me puede ayudar con esto? Publiqué el código del controlador en la publicación original. –

0

Sus anotaciones dentro del archivo generado automáticamente siempre desaparecerán cuando se modifique el modelo en el diseñador.

Puede ampliar su clase con propiedades personalizadas escribiendo una clase parcial y almacenándola en un archivo separado.

public partial class MyClass 
{ 
    [AllowHtml] 
    public int MyAnnotatedProperty 
    { 
     get { ... } 
     set { ... } 
    } 
} 

Si desea anotar una propiedad de auto-generado echar un vistazo a James D'Angelo's answer anteriormente.

+2

Pero él tiene esta característica en el otro archivo. Creo que debes usar el atributo Metadata para su problema – gdoron

+0

¿Esto también se incluirá automáticamente en el modelo general? ¿Y será visible allí? –

+0

¿Te refieres al diseñador de edmx? No, no será visible allí. –

0

Otra posible solución es utilizar una plantilla de metadatos y anotaciones de datos como se describe en here