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:
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.
Appelons ma conception de base de données design Option A.
Je voulais un design qui ressemblait plus à ceci:
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?
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. –
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
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! –