2013-07-25 1 views
4

J'utilise Entity Framework avec le modèle Code First (projet favori, et j'adore éditer des classes simples et mettre mon schéma à jour automatiquement). J'ai une classe comme suit:Champs XML avec Entity Framework Code Premier

[Table("Polygons")] 
public class Polygon 
{ 
    public int PolygonId { get; set; } 
    public String Texture { get; set; } 

    public virtual ICollection<Point> Points { get; set; } 
} 

[Table("Points")] 
public class Point 
{ 
    public int PolygonId { get; set; } 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

Il est utile pour moi de stocker Polygones dans la base de données, et être en mesure d'interroger leur texture. D'un autre côté, si je sauvegarde un polygone avec 5 000 points dans la base de données, il faut une éternité pour exécuter autant d'insertions, et honnêtement, je ne vais jamais interroger des points sauf pour récupérer un polygone individuel.

Ce que j'aimerais faire est de se débarrasser de « PolygonId » dans la classe « Point », se débarrasser des « points » table, et ont la table Polygon ressembler

PolygonId int PK 
Texture varchar(255) 
Points XML 

Et Ensuite, les points sont numérotés en une chaîne enregistrée directement dans la table, mais non-réérialisée en un tableau de points. Existe-t-il un moyen d'utiliser EF ou d'écrire un sérialiseur/désérialiseur personnalisé pour le champ, donc au moins il semble automatique lorsqu'il est utilisé dans le code-base?

Merci,

Dan

Répondre

6

Je pense que vous devez ajouter une autre propriété et d'écrire du code pour faire la sérialisation.

Cela devrait le faire:

[Table("Polygons")] 
public class Polygon 
{ 
    public int PolygonId { get; set; } 
    public String Texture { get; set; } 

    [NotMapped] 
    public virtual ICollection<Point> Points { get; set; } 

    [Column("Points")] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public string PointsXml 
    { 
     get 
     { 
      var serializer = new XmlSerializer(typeof (List<Point>)); 
      using (var stringWriter = new StringWriter()) 
      { 
       serializer.Serialize(stringWriter, Points.ToList()); 
       stringWriter.Flush(); 
       return stringWriter.ToString(); 
      } 
     } 
     set 
     { 
      var serializer = new XmlSerializer(typeof(List<Point>)); 
      using (var stringReader = new StringReader(value)) 
      { 
       Points = (List<Point>) serializer.Deserialize(stringReader); 
      } 
     } 
    } 
} 

Les EditorBrowsable et DebuggerBrowsable attributs sont facultatifs et juste garder la propriété XML d'apparaître dans IntelliSense (lorsque ce type est utilisé à partir d'une bibliothèque) et le débogueur.

Questions connexes