Entité framework série serialization de plusieurs propriétés à une colonne

Je voudrais mapper la class suivante à une table, en utilisant un entity framework, de preference avec une API fluide.

public class MyEntity { public int Id {get;set;} public ssortingng Name {get;set;} public int Age {get;set;} public ssortingng OtherData {get;set;} public List<Blabla> BlaBlaList {get;set;} } 

Table MyEntity:

 column Id column Name column SerializedData 

Est-il possible de mapper uniquement les colonnes Id et Name et toutes les autres propriétés sérialisées dans la colonne "SerializedData"?

Si ce n'est pas "seulement" les autres propriétés, l'object entier peut également être sérialisé dans la colonne SerializedData

Merci, Steven

Une autre réponse semblable à la réponse de Drew serait de faire quelque chose comme:

 public class MyEntity : IMySerializable { public int Id {get;set;} public ssortingng Name {get;set;} [NotMapped] public int Age {get;set;} [NotMapped] public ssortingng OtherData {get;set;} [NotMapped] public List<Blabla> BlaBlaList {get;set;} public byte[] SerializedData { get { return this.MySerialize(); } set { this.MyDeserialize(value); } } } 

Puis une méthode d'extension pour vous permettre de faire cela à plus d'une entité:

 public static IMySerializableExtensions { public static byte[] MySerialize<T>(this T instance) where T : IMySerializable { byte[] result = // ... // code return result; } public static void MyDeserialize<T>(this T instance, byte[] value) where T : IMySerializable { // deserialize value and update values } } 

Vous pouvez déterminer les propriétés à désérialiser / sérialiser car elles auront le NotMappedAtsortingbute sur eux.

Vous devrez le faire vous-même …

Je vous recommand de créer une class distincte pour le mappage de database et de laisser MyEntity en tant que POCO. Au final, c'est la preference, mais je préfère garder mes entités aussi proches que possible de la structure de la database. C'est plus facile de maintenir ça.

Donc, après avoir dit cela, créez une class séparée qui est l'object avec lequel vous allez interagir, et donnez-lui une méthode d'instance pour se sérialiser, et une méthode statique pour la déserialization. J'ai utilisé JSON ici mais vous pouvez faire ce que vous voulez. Note J'ai également ajouté une méthode pour le convertir en MyDBEntity: votre logique sera probablement ailleurs, mais cela devrait vous donner une idée de la façon de le faire.

 public class MyEntity { public int Id { get; set; } public ssortingng Name { get; set; } public int Age { get; set; } public ssortingng OtherData { get; set; } public List<int> BlaBlaList { get; set; } public byte[] Serialize() { ssortingng json = JsonConvert.SerializeObject(this); return Encoding.ASCII.GetBytes(json); } public static ssortingng Deserialize(byte[] objectBytes) { return Encoding.ASCII.GetSsortingng(objectBytes); } public MyDBEntity ConvertToDBEntity() { MyDBEntity dbEntity = new MyDBEntity(); dbEntity.ID = Id; dbEntity.Name = Name; dbEntity.SerializedData = this.Serialize(); return dbEntity; } } public class MyDBEntity { public int ID { get; set; } public ssortingng Name { get; set; } public byte[] SerializedData { get; set; } } 

Ensuite, ajoutez la class MyDBEntity à votre context:

 public class EFContext : DbContext { public DbSet<MyDBEntity> Entities { get; set; } } 

C'est à peu près ça! maintenant vous pouvez faire des choses comme

  using (var db = new EFContext()) { MyEntity me = new MyEntity(); me.Name = "Bob"; me.Age = 25; me.OtherData = "he does stuff"; me.BlaBlaList = new List<int> { 7, 8, 9 }; MyDBEntity newEntity = me.ConvertToDBEntity(); db.Entities.Add(newEntity); db.SaveChanges(); } 

J'ai travaillé sur une petite application de console pour cette réponse, je l'ai mise sur Github si vous voulez.