2

Vue d'ensembleLequel est un meilleur design de données ou modèle d'objet?

Je suis la conception d'un mécanisme pour générer des commandes dynamiques dans une application ASP.NET MVC qui utilise ADO.NET Entity Framework. Cependant, ma question n'a rien à voir avec MVC et un peu avec Entity Framework. Il s'agit de comparer deux modèles d'objets.

Déclaration de problème

Dans mon application, un utilisateur doit avoir la capacité d'interagir avec page Web A de préciser qu'il veut ajouter ces et de tels contrôles HTML pour Web Page B.

Lorsqu'il navigue Page Web B Ensuite, il doit voir ces contrôles et être capable de les utiliser.

Qu'est-ce pas Le défi

J'ai écrit le code pour générer les contrôles. C'était la partie facile. J'ai utilisé le Tag Builder, les vues partielles, les extensions HtmlHelper et les modèles d'éditeur &.

Le défi Le défi est d'arriver à une conception de base de données et un modèle d'objet généré par Entity Framework pour contenir les métadonnées sur les contrôles qui doivent être générés.

Je suis venu avec une conception de base de données comme indiqué ci-dessous:

Database Diagram

Vous pouvez ignorer l'utilisateur et les autorisations tables. Ils ne sont pas pertinents pour notre discussion. Entity Framework génère les entités suivantes en fonction de la conception de base de données ci-dessus.

Entity Framework Model based on the database design

Appelons ma conception de base de données design Option A.

Je voulais un design qui ressemblait plus à ceci:

An Object Model I Would Have Liked To Have: A More Intuitive Option

Appelons cette deuxième conception comme design Option B.

Le code (version dépouillée) pour cette deuxième option ressemblerait à ceci:

namespace DynamicControls 
{ 
    public class DynamicControlGroup 
    { 
     public long Id { get; set; } 

     public string Name { get; set; } 

     public string Description { get; set; } 

     public string Controller { get; set; } 

     public IEnumerable<string> Actions { get; set; } 

     public DateTime StartDate { get; set; } 

     public DateTime? EndDate { get; set; } 

     public User CreatedByUser { get; set; } 

     public DateTime CreationDateTime { get; set; } 

     public User LastModifiedBy { get; set; } 

     public DateTime ModificationDateTime { get; set; } 

     // Navigational 
     public ICollection<DynamicControl<T>> DynamicControls { get; set; } 
    } 

    public class DynamicControl<T> 
    { 
     public long Id { get; set; } //db Id 

     public string HtmlId { get; set; } 

     public bool ValueRequired { get; set; } 

     public virtual ControlType ControlType { get; protected set; } 

     // Every control is capable of having a default value but of a different 
     // type. Most controls have default values of type text (string). The 
     // multi-select ones (checkboxes, multi-select lists, etc.) have a default 
     // value of type IEnumerable<string>. So, I want to leave this generic. 
     // But I am not that hung-up on this. I am fine if I am required to move 
     // this property DefaultValue from the base class and make it a concrete 
     // (not generic) property for each individual child class. 

     // Mostly I just want the heirarchy. And before that, I want to know 
     // if it is a good idea to model this heirarchy. Or is it better to just 
     // work with what my Entity Framework produced for my db? 

     // Should I change my db? I can because I thought-up the design for 
     // those tables. 
     public virtual T DefaultValue { get; set; } 

     // Navigational 
     public DynamicControlGroup DynamicControlGroup { get; set; } 
    } 

    public class TextBox : DynamicControl<string> 
    { 
     public override ControlType ControlType 
     { 
      get 
      { 
       return DynamicControls.ControlType.TextBox; 
      } 
     } 

     public string Label { get; set; } 

     public int MaxLength { get; set; } 
    } 

    public class PasswordControl : TextBox 
    { 
     public override ControlType ControlType 
     { 
      get 
      { 
       return DynamicControls.ControlType.Password; 
      } 
     } 
    } 

    public class TextArea : TextBox 
    { 
     public override ControlType ControlType 
     { 
      get 
      { 
       return DynamicControls.ControlType.TextArea; 
      } 
     } 

     public int Rows { get; set; } 
    } 

    public class DropDownList: DynamicControl<string> 
    { 
     public override ControlType ControlType 
     { 
      get 
      { 
       return ControlType.DropDownList; 
      } 
     } 

     // I want something like this. That I should be able to say 
     // 
     // myDropDownListObject.Options... 
     // 
     // You'll notice that given my current database design, I have 
     // no direct way of accessing the options of a, say, drop down list. 
     // To do that, I have to make a round-about Linq query. 
     public ICollection<DynamicControlOption> Options { get; set; } 
    } 

    public class DynamicControlOption 
    { 
     public long Id { get; set; } // db Id 

     public string OptionHtmlId { get; set; } 

     public string OptionValue { get; set; } 

     public string OptionText { get; set; } 

     // Navigational property 
     public DynamicControl<IEnumerable<string>> TheControlWhoseOptionIAm { get; set; } 
    } 

    public class User 
    { 
    } 

    public class Permission 
    { 
    } 

    public enum ControlType 
    { 
     TextBox, 
     TextArea, 
     Password, 
     RadioButton, 
     Checkbox, 
     DropDownList, 
     MultiSelectList, 
     DatePicker, 
     TimePicker, 
     DateTimePicker 
    } 
} 

Ma question 1) Je sens que je voudrais la conception Option B mieux. Est-ce que je me sens bien?

2) Je sais que je peux travailler avec Option de conception A tout aussi bien, mais cela impliquera un peu de rond-chemin à faire certaines choses. Par exemple, pour obtenir toutes les options d'une liste déroulante, il n'y a pas de propriété de navigation dans la classe DropDownList dans Option de conception A. Je vais devoir écrire une requête Linq pour faire cela.

3) Est-il possible que Entity Framework soit proche de générer Option de conception B? Comment? Quels changements dois-je apporter à la conception de ma base de données pour y parvenir?

Répondre

1

Maintenant, nous travaillons sur un projet comme celui-ci dans notre entreprise ... Si j'ai bien compris et si j'étais vous ... j'ai implémenté la structure héritée comme ma base de données comme ci-dessous. Maintenant, vous classes sont héritage mais votre conception de base de données ne l'est pas.

J'ai enlevé Id dans TextBox et j'ai mis ControlId PK et FK dans le même temps. (pas seulement FK).

en fait, ControlId est à la fois PK pour TextBox et FK de DynamicControl et aussi de cette façon pour PasswordControl et TextArea

et maintenant ControlId dans TextBox n'est pas Identité. Il obtient est ControlId de DynamicControl

enter image description here

J'accepte aussi design Option B toujours .I'm plus confortable que l'utilisation design Option A .in mon idée Sa structure vraie et principale

+1

Merci, Fuad. Vous avez parfaitement raison. Cela a beaucoup aidé, mais n'était pas complètement nécessaire. J'ai regardé mes vieux livres et je me suis souvenu qu'il y avait quelque chose appelé Table par type Hiérarchie/Héritage dans Entity Framework. J'ai utilisé ça. –

+1

Je suis vraiment heureux.Votre ami de bienvenue.Vous savez ... Je pense que ce que vous vouliez créer une relation d'héritage en utilisant Entity Framework n'est pas possible, n'est-ce pas? ... car sql ne peut pas trouver d'héritage relation.Sql peut simplement créer une relation de jointure, n'est-ce pas? Puissiez-vous pouvoir l'implémenter manuellement et remplacer et transformer ces relations jointes en héritage en VS ... de toute façon ... vous semblez plus expérimenté que moi ami :) Je voulais juste vous aider et moi-même – Fuad

+1

Hey, vous êtes trop gentil. Je ne suis pas meilleur que quiconque. Je suce beaucoup de temps. Je vieillis et je continue à poser des questions pour résoudre les problèmes. Vous êtes génial! –

Questions connexes