2

ОбзорКакая из них - лучший дизайн данных или объектная модель?

Я разработка механизма для создания динамических элементов управления в приложении ASP.NET MVC, который использует ADO.NET Entity Framework. Однако мой вопрос не имеет ничего общего с MVC и немного связан с Entity Framework. Речь идет о сравнении двух объектных моделей.

Постановка задачи

В моем приложении, пользователь должен иметь возможность взаимодействовать с веб-странице, чтобы указать, что он хочет, чтобы добавить такие и такие HTML элементы управления веб-страницы B.

Когда он просматривает веб-страницу B, он должен видеть эти элементы управления и иметь возможность их использовать.

Что Не Вызов

Я написал код, генерировать управления. Это была легкая часть. Я использовал построитель тегов, частичные представления, расширения HtmlHelper и отображать & Редактор шаблонов.

Задача Задача заключается в достижении в разработке баз данных и объектной модели генерируемой Entity Framework для хранения метаданных о параметрах, которые должны быть получены.

Я придумал дизайн базы данных, как показано ниже:

Database Diagram

Вы можете игнорировать пользователя и разрешений таблицы. Они не имеют отношения к нашему обсуждению.

Entity Framework генерирует следующие объекты на основе вышеуказанного дизайна базы данных.

Entity Framework Model based on the database design

Давайте называть свой проект базы данных как Design Вариант A.

Я бы хотел дизайн, который выглядел примерно так:

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

Давайте назовем это второй проект как Design Option B.

Код (урезанная версия) для этого второго варианта будет выглядеть следующим образом:

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 
    } 
} 

Мой вопрос 1) Я чувствую, что я хотел бы дизайн Вариант B лучше. Я чувствую себя хорошо?

2) Я знаю, что могу работать с Вариант дизайна A так же хорошо, но это потребует немного кругового движения, чтобы сделать что-то. Например, чтобы получить все варианты для выпадающего списка, в классе DropDownList нет навигационного свойства в Вариант дизайна A. Мне нужно написать круглый вопрос Linq для этого.

3) Возможно ли, что Entity Framework приблизится к генерации Вариант дизайна B? Как? Какие изменения мне нужно внести в мой проект базы данных для достижения этого?

ответ

1

Теперь мы работаем над таким проектом, как это в нашей компании ... Если бы я правильно понял ваше значение, и если бы я был вами ... Я реализовал унаследованную структуру в качестве моего проекта базы данных, как показано ниже. Теперь вы Классы являются наследованием, но ваш дизайн базы данных не является.

Я удалил Id в TextBox и я поставил ControlID, как PK и FK в то же время. (а не только FK).

на самом деле, ControlID одновременно PK для TextBox и FK из DynamicControl , а также это способ для PasswordControl и TextArea

и теперь ControlID в TextBox не Идентификация. Он получает это ControlID из DynamicControl

enter image description here

Я также принимаю Design Option B .Я всегда более комфортно, чем при использовании Design Вариант A .в моей идее, это правда, и основную структуру

+1

Спасибо, Фуад. Ты совершенно прав. Это очень помогло, но не было полностью необходимо. Я просмотрел свои старые книги и вспомнил, что в Entity Framework есть что-то, называемое таблицей на иерархию типов/наследование. Я использовал это. –

+1

Я действительно счастлив. Ваш приветственный друг. Вы знаете ... Я думаю, что вы хотели создать отношение наследования с помощью Entity Framework, не возможно, не так ли? ... потому что sql не может найти наследование Отношение.Sql может просто создать отношение соединения, не так ли? Можете ли вы реализовать его вручную и заменить и превратить эти объединенные отношения в наследование в VS ... в любом случае ... вы выглядите более опытным, чем я, друг :) Я просто хотел помочь вам и мне – Fuad

+1

Эй, ты слишком добрый. Я не лучше всех. Я сосать большое время. Я старею, и я просто задаю вопросы для решения проблем. Ты восхитителен! –

Смежные вопросы