12
votes

Comment ajouter des attributs sérialisables dans toutes les entités générées par l'entité Framework 5.0

J'utilise EF 5.0 pour générer des entités de POCO et l'utiliser dans une couche d'accès à des données séparées

Je veux étiqueter toutes les entités [Serializable]

Comment modifier le modèle pour ajouter un attribut sérialisable?


0 commentaires

6 Réponses :


6
votes

Voici les étapes à suivre:

1) Ouvrez le fichier ModelName.Enty.tt P>

2) Localisez la chaîne suivante dans ce fichier P>

[Serializable] 
<#=Accessibility.ForType(entity)


0 commentaires

16
votes

Si vous ne souhaitez pas modifier le modèle, vous pouvez également le faire dans un fichier de code distinct - en raison de la commodité des classes partielle . Donc si les types ici sont FOO , bar et Baz dans le My.Namespace Espace de noms, vous pouvez créer un Séparer le fichier dans le même projet, avec: xxx

Ceci sera ensuite fusionné avec la moitié générée, appliquant l'attribut [sérialisable] . Il vous permettra également d'ajouter vos propres méthodes aux types ou de fournir le corps de tout méthode partielle méthode que le modèle déclare.

Je devrais cependant vous avertir : [sérialisable] suggère que vous utilisez binarinformatter ; C'est pas nécessairement un bon candidat. Il serait préférable de regarder des sérialisés basés sur des contrats. Je serais très surpris si le modèle EF n'avait pas déjà l'option d'attributs de sortie de DatacontractSerializer (spécifiquement, [DataContract] [Datamember] ). BinaryFormatter peut être très problématique que votre logiciel.


2 commentaires

+1 Pour l'avertissement, merci pour l'approche alternative. Cependant, je trouve difficile d'écrire une ligne par type, je dois également vous rappeler d'ajouter une ligne supplémentaire à chaque fois que j'ajouterai un nouveau type au modèle.


@Imranrizvi Eh bien, puisque vous évidemment (toux) ajoutez également de nouveaux tests d'intégration de sérialisation chaque fois que vous ajoutez un type qui doit être sérialisé, il montrera très rapidement quand il y a un problème. Évidemment; P Vous pouvez également ajouter un test qui trouve tous vos types POCO / DTO via une réflexion et vérifie l'attribut / drapeau drapeau.



11
votes

Si vous utilisez l'entité framework 5.0 ou plus Ajouter une balise [Serializable] entre ce code:

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>

[Serializable]

<#=codeStringGenerator.EntityClassOpening(entity)#>


1 commentaires

@nazimhatipoglu, merci. J'ai ajouté [DataContract] dans cette ligne et j'ai ajouté l'attribut à chaque classe. Mais comment utiliser System.Runtime.Sérialisation? Et comment ajouter [Datamember] aux propriétés du modèle?



1
votes

pour EF 6 Essayez de trouver le code suivant dans .tt Fichier: xxx

Il a un espace porteur de chaîne ("{0} {1 } Classe partielle {2} {3} ") Vous pouvez le changer à ce que vous voulez


1 commentaires

Veuillez vous référer à la façon de répondre sur Stackoverflow.



9
votes

pour l'entité framework 6, ajoutez sérialisable au-dessus de ces deux parties à MODER.TT

[Serializable]
Partial <#=Accessibility.ForType(complex)#>

[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>


0 commentaires

6
votes

Voici ce que vous faites pour EF 6 (au moins);

dans votre fichier modèle.tt, recherchez ces lignes: p> xxx pré>

changez-le à ces : P>



    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} " + Environment.NewLine + " {1} {2} partial class {3}{4}", 
            "[Serializable]", 
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
    }


0 commentaires