0

Suite à un SO dicsussion here, j'ai implémenté des classes partielles afin de créer des valeurs de date-heure par défaut pour mes champs de base de données Créé et Modifié dans un constructeur.Classes partielles EF et valeurs par défaut

Maintenant le problème est que ma base de données a plus de 100 tables, et 75+ d'entre elles ont la même structure de base qui inclut une définition de colonne Créé et Modifié. Donc, au lieu de créer plus de 75 classes partielles que je dois maintenir, est-il possible de créer une classe de base dont chaque type EF hérite, qui hérite du constructeur par défaut pour remplir les valeurs DateTime de Created et Modifié?

EDIT: Il convient de noter est que j'utilise EF 4.0

+1

Y a-t-il une raison pour laquelle vous n'avez pas utilisé 'StoreGeneratedPattern =" Computed "'? –

+0

parce que je crois comprendre que cela sera écrasé chaque fois que l'objet est mis à jour. – Darbio

+0

ce comportement est vérifié ici: http://msdn.microsoft.com/fr-fr/library/system.data.metadata.edm.storegeneratedpattern.aspx – Darbio

Répondre

1

Vous pouvez certainement spécifier votre propre classe de base avec EF4 et EF1, mais c'est beaucoup plus facile avec EF4. Faites un clic droit sur la surface de conception et vous devriez voir une option pour ajouter un élément de génération de code. Sélectionnez le générateur d'objet entité ADO.Net. Ce sera un fichier T4 à votre projet (extension .tt) qui spécifie le modèle à utiliser pour générer vos classes d'entité à partir du modèle. Pour spécifier une classe de base différente, recherchez une ligne à l'intérieur comme

Remplacez EntityObject par votre classe de base. Notez que si vous utilisez ce modèle, votre classe de base doit hériter de System.Data.Objects.DataClasses.EntityObject - vous pouvez utiliser un modèle POCO à la place, mais cela vous suffira probablement.

1

Vous pouvez certainement dire EF d'utiliser une classe de base pour vos entités (il est juste dans le concepteur comme une propriété de l'entité) ... mais Si vous voulez vous assurer de la valeur par défaut de ce champ, vous pourriez peut-être vous connecter aux deux événements de vos ObjectContext SavingChanges et ObjectMaterialized.

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.savingchanges.aspx

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized.aspx

Vous pouvez utiliser ces possibilités d'injecter la valeur par défaut (s) que vous souhaitez utiliser. Par exemple, dans votre gestionnaire SavingChanges, vous pouvez vérifier le ObjectStateManager sur le contexte pour voir si l'état de l'entité concernée est EntityState.Added, puis définir les dates Created et Modified comme souhaité.

Alternativement, comme suggéré, est-il une raison pour laquelle la valeur par défaut de la colonne dans SQL Server ne peut pas être simplement GetDate()? (En supposant que vous utilisez SQL Server) ....

+0

Merci Jeff. Oui, pour une raison quelconque, les valeurs par défaut ne sont pas propagées à EF à partir de SQL Server, en effet j'ai défini la valeur par défaut getdate(), mais lorsque je remplis l'objet dans EF, la date est définie sur DateTime.Minimum sur SqlServer. En ce qui concerne la définition d'une classe de base dans le concepteur, j'ai vu cela mais cela ne vous permet que de sélectionner une classe dans le modèle EF, pas celle que vous avez créée en dehors du concepteur. – Darbio

Questions connexes