Ver Fonte

NEW Couche Entity ok

julien.legrand há 9 anos atrás
pai
commit
c8b7802bf3

+ 4 - 0
CD67.ModeleMVC.Entity/CD67.ModeleMVC.Entity.csproj

@@ -73,6 +73,9 @@
       <DesignTime>True</DesignTime>
       <DependentUpon>EntityModel.edmx</DependentUpon>
     </Compile>
+    <Compile Include="Extend\PARAM.cs" />
+    <Compile Include="Internal\Entities.cs" />
+    <Compile Include="Internal\FormattedDbEntityValidationException.cs" />
     <Compile Include="PARAM.cs">
       <DependentUpon>EntityModel.tt</DependentUpon>
     </Compile>
@@ -107,6 +110,7 @@
   <ItemGroup>
     <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

+ 38 - 0
CD67.ModeleMVC.Entity/Extend/PARAM.cs

@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+// Attention à l'espace de nom, lors de la création d'une nouvelle classe celui-ci sera par défaut :
+// namespace CD67.ModeleMVC.Entity.Extend
+// Alors que pour étendre une classe il faut être dans le même namespace que l'original
+namespace CD67.ModeleMVC.Entity
+{
+    /// <summary>
+    /// Classe d'extension de celle d'Entity, nécessaire pour y associer les Metadata
+    /// </summary>
+    [MetadataType(typeof(PARAM_Metadata))]
+    public partial class PARAM
+    {
+        //Peut contenir une extension utile à la classe (méthode static ou non, nouvelles propriétés, propriétés construites dynamiquement selon d'autres de la classe, etc.)
+    }
+
+    /// <summary>
+    /// Classe contenant les DataAnnotations pour chaque champ
+    /// </summary>
+    public class PARAM_Metadata
+    {
+        [Required]
+        [Display(Name = "Clé")]
+        public string PRM_CLE { get; set; }
+        [Required]
+        [Display(Name = "Libellé")]
+        public string PRM_LIB1 { get; set; }
+        [Required]
+        [Display(Name = "Valeur")]
+        [DataType(DataType.MultilineText)]
+        public string PRM_LIB2 { get; set; }
+    }
+}

+ 29 - 0
CD67.ModeleMVC.Entity/Internal/Entities.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Entity.Validation;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CD67.ModeleMVC.Entity
+{
+    public partial class Entities
+    {
+        /// <summary>
+        /// Ajout d'une meilleure gestion des exceptions Entity pour la méthode "SaveChanges"
+        /// </summary>
+        /// <returns></returns>
+        public override int SaveChanges()
+        {
+            try
+            {
+                return base.SaveChanges();
+            }
+            catch (DbEntityValidationException e)
+            {
+                var newException = new Internal.FormattedDbEntityValidationException(e);
+                throw newException;
+            }
+        }
+    }
+}

+ 49 - 0
CD67.ModeleMVC.Entity/Internal/FormattedDbEntityValidationException.cs

@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Entity.Validation;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CD67.ModeleMVC.Entity.Internal
+{
+    public class FormattedDbEntityValidationException : Exception
+    {
+        public FormattedDbEntityValidationException(DbEntityValidationException innerException) :
+            base(null, innerException)
+        {
+        }
+
+        public override string Message
+        {
+            get
+            {
+                var innerException = InnerException as DbEntityValidationException;
+                if (innerException != null)
+                {
+                    StringBuilder sb = new StringBuilder();
+
+                    sb.AppendLine();
+                    sb.AppendLine();
+                    foreach (var eve in innerException.EntityValidationErrors)
+                    {
+                        sb.AppendLine(string.Format("- Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
+                            eve.Entry.Entity.GetType().FullName, eve.Entry.State));
+                        foreach (var ve in eve.ValidationErrors)
+                        {
+                            sb.AppendLine(string.Format("-- Property: \"{0}\", Value: \"{1}\", Error: \"{2}\"",
+                                ve.PropertyName,
+                                eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName),
+                                ve.ErrorMessage));
+                        }
+                    }
+                    sb.AppendLine();
+
+                    return sb.ToString();
+                }
+
+                return base.Message;
+            }
+        }
+    }
+}

+ 5 - 0
CD67.ModeleMVC.sln

@@ -11,6 +11,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CD67.ModeleMVC.MVC", "CD67.
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CD67.ModeleMVC.Tests", "CD67.ModeleMVC.Tests\CD67.ModeleMVC.Tests.csproj", "{DA01D22C-4381-4429-B131-84C06DCBA3E0}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{46D86818-A2B5-4E94-8A37-FF7C8EBE5F25}"
+	ProjectSection(SolutionItems) = preProject
+		ReadMe.txt = ReadMe.txt
+	EndProjectSection
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU

+ 47 - 0
ReadMe.txt

@@ -0,0 +1,47 @@
+Mode d'emploi du projet modèle MVC-entity
+
+*-*-*-*-*-*
+historique
+v0.1 13/07/2016 (Julien Legrand) : 1ère version
+*-*-*-*-*-*
+
+# Actions à faire après copie
+1. Renommer les projets en suivant ce schéma : "CD67.[nom appli].[Entity/Factory/MVC/Tests/Batchs]"
+2. Renommer également les assemblies et espaces de nom de chaque projet (dans les propriétés des projets, onglet "Application")
+
+x. Supprimer les fichiers Exemples :
+- CD67.ModeleMVC.Entity\Extend\PARAM.cs
+
+10. supprimer ce fichier pour ne pas que l'on sache que vous avez utilisé un modèle
+
+# Description générale
+La solution est consituée de 4 projets :
+- CD67.ModeleMVC.Entity : Projet qui contient les objets métiers, c'est à dire dans le cas de projets Entity : le modèle entity framework
+- CD67.ModeleMVC.Factory : Projet qui contient les classes permettant la gestion des objets : les actions CRUD pour chacun à minima
+- CD67.ModeleMVC.MVC : Projet qui comprent le site Web MVC
+- CD67.ModeleMVC.Tests : Tests unitaires
+
+# CD67.ModeleMVC.Entity
+Le modèle se nomme par défaut "EntityModel"
+
+Le dossier "Extend" contient les extensions éventuelles de classe Entity (qui se trouvent dans "EntityModel.edmx\EntityModel.tt\").
+C'est notamment utile pour ajouter les DataAnnotations permettant de décrire le données en vue d'une génération de contrôles plus appropiés dans les vues MVC.
+Attention à bien surveiller l'espace de noms lors de la création d'une classe dans ce sous-dossier (erreur fréquente) :
+- par défaut ce sera : "CD67.ModeleMVC.Entity.Extend",
+- mais il faut "CD67.ModeleMVC.Entity" (le même que les classes de bases Entity).
+
+Le dossier "Internal" contient :
+- "FormattedDbEntityValidationException.cs" : classe héritée de Exception qui permet un affichage plus complet dans les messages d'erreur pour les exceptions liées au format de données du modèle Entity
+- "Entities.cs" : classe partielle permettant d'utiliser les nouvelles Exceptions FormattedDbEntityValidationException en surchargeant "SaveChanges()"
+En cas d'ajout d'une nouvelle connexion avec Entity Framework, il faut ajouter une nouvelle classe d'extension du même type.
+
+# CD67.ModeleMVC.Factory
+Les classes sont nommées ainsi : "[Nom objet]Factory"
+
+Chaque "Factory" hérite de la classe de base "baseFactory"
+
+# CD67.ModeleMVC.MVC
+La partie Model du projet n'est pas nécessaire que pour définir des classes ne servant qu'à l'affichage, les classes mêtiers étant dans le projet Entity.
+
+# CD67.ModeleMVC.Tests
+Projet le plus important de la solution :)