12

Me gustaría usar SQL Server xml escriba como un tipo de columna para una clase de entidad.Tipo de datos XML en EF 4.1 Código Primero

Según this thread es posible asignar una columna de este tipo a cadena Tipo:

public class XmlEntity 
{ 
    public int Id { get; set; } 

    [Column(TypeName="xml")] 
    public string XmlValue { get; set; } 
} 

La tabla se genera correctamente en el datebase por esta definición. Los nuevos objetos XmlEntity también se pueden crear.

Pero entonces tratar de conseguir alguna entidad de la base de datos: se produce

var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault(); 

un error: se detectaron

uno o más errores de validación durante la generación del modelo System.Data .Edm.EdmEntityType: EntityType 'XElement' no tiene una clave definida. Defina la clave para este EntityType.

Respuesta

18

el problema estaba en mi propiedad envoltorio:

[NotMapped] 
public XElement XmlValueWrapper 
{ 
    get { return XElement.Parse(XmlValue); } 
    set { XmlValue = value.ToString(); } 
} 

yo no especificado NotMapped atributo.

+1

¡Gracias por compartir! –

+0

@alexey, gran pregunta y respuesta, pero ¿la pregunta no tendría más sentido si incluyese la propiedad XElement en ella, según los artículos de MSDN? Actualmente no hay una propiedad XElement. Por lo tanto, no está claro que el único cambio sea el atributo [NotMapped]. –

7

Solo para completarlo. Aquí está todo el código necesario, en una parte.

[Column(TypeName = "xml")] 
public String XmlContent { get; set; } 

[NotMapped] 
public XElement InitializedXmlContent 
{ 
    get { return XElement.Parse(XmlContent); } 
    set { XmlContent = value.ToString(); } 
} 
3

Esto es como lo haces en Anotaciones de datos, si desea utilizar la API de Fluido (y utilizar una clase de mapeo) a continuación:

public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity> 
{ 
    public FilterMap() 
    { 
     // ... 
     this.Property(c => c.XmlContent).HasColumnType("xml"); 

     this.Ignore(c => c.XmlValueWrapper); 
    } 
} 

Si utiliza la API Fluido anulando OnModelCreating en DbContext entonces simplemente cambie esos "esto" con modelBuilder.Entity <XmlEntity>()

Cuestiones relacionadas