12

Je voudrais utiliser SQL Server xml comme type de colonne pour une classe d'entité.Type de données XML dans EF 4.1 Code Premier

Selon this thread il est possible de tracer une telle colonne à type chaîne:

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

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

Le tableau est correctement généré dans le datebase par cette définition. De nouveaux objets XmlEntity peuvent également être créés.

Mais j'essaie d'obtenir une entité de la base de données:

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

Une erreur se produit:

ont été détectés Une ou plusieurs erreurs de validation lors de la génération de modèle System.Data .Edm.EdmEntityType: EntityType 'XElement' n'a pas de clé définie. Définissez la clé pour cet EntityType.

Répondre

18

Le problème était ma propriété emballage:

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

Je n'ai pas spécifié NotMapped attribut.

+1

Merci pour le partage! –

+0

@alexey, excellente question et réponse, mais la question n'aurait-elle pas plus de sens si vous y incluiez la propriété XElement - par les articles MSDN? Actuellement, il n'y a pas de propriété XElement. Il n'est donc pas clair que le seul changement est l'attribut [NotMapped]. –

7

Juste pour être complet. Voici tout le code nécessaire, en une partie.

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

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

C'est la façon dont vous le faites dans les annotations de données, si vous voulez utiliser l'API Courant (et utiliser une classe de cartographie) puis:

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

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

Si vous utilisez l'API Fluent en remplaçant OnModelCreating sur DbContext puis il suffit de changer ces "ceci" avec modelBuilder.Entity <XmlEntity>()

Questions connexes