0

ОБНОВЛЕНО КОДОМ!Объектно-ориентированные модели базы данных

Я разрабатываю веб-приложение с использованием ASP.NET MVC 3, и я хочу создать объектно-ориентированный список, используя «ADO.NET Entity Data Model».

Я создал модели по структуре сущности «Code-First», используя «ADO.NET Entity Data Model», а затем создал базу данных. После этого я создал целый DAL, используя «Reverse инженер Code First» из базы данных, содержащей мои классы плюс объект DataContext.

У меня есть простой тип, называемый «Item», содержащий свойство «Name». Кроме того, существуют некоторые производные типы, такие как «Оружие» и «Броня», содержащие эксклюзивные свойства, такие как «Урон» и «Защита» соответственно.

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

Это моя цель, будучи в состоянии перебрать все элементы игрока, включая их свойства, даже если они получены из пункта:

 // Creating a game context that derives from DbContext 
     GameContext context = new GameContext(); 

     // Take my profile 
     Player me = context.Players.First(); 

     // Get my items and show them, show both 
     var myItems = me.Items; 

     // Printing all the items that I have with the properties of the derrived objects as well 
     // ("Weapon" and "Armour" objects as well (They derive from "Item" object) 
     foreach (var item in myItems) 
     { 
      // Accessing the item's name. every item has this property, so there is nothing special. 
      Console.WriteLine("Name:" + item.ItemName); 

      if (item.Type == "Weapon") 
      { 
       // Accessing the item's damage, which is uniqe to a weapon (that derrives from "Item" object). 
       Console.WriteLine("Damage:" + (Weapon)item.ItemDamage); 
      } 

      if (item.Type == "Armour") 
      { 
       // Accessing the item's defense, which is uniqe to an armour (that derrives from "Item" object). 
       Console.WriteLine("Defense:" + (Armour)item.ItemDefense); 
      } 
     } 

Теперь дальше это то, что у меня есть и Меня не устраивает, хотя я считаю, что это не нужно.

Мои текущие модели отношений (что я не доволен): These are my models created in a "ADO.NET Entity Data Model"

Пункт базового класса, которые содержат различные элементы, отметим, что использование «Item» объекта так же, как использование абстрактного класс - он будет использоваться только его производными классами - «Оружие», «Броня», «Ювелирные изделия» и т. д.

Оружие, содержащее свойство навигации соответствующего элемента, а также его собственные свойства (Ущерб в этом случае).

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

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

Кто-нибудь знает, как я могу это достичь?

+0

Неясно, какие элементы вы хотите перебрать ... Делитесь проект кодекса. –

+0

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

ответ

1

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

  • Right щелкните и выберите «Добавить элемент генерации кода».
  • Из «Добавить новый мастер» выберите ADO.NET DBContext Generator. Вы увидите см. Его имя Model1.tt (t4 template).
  • Измените имя, если хотите, и выберите Добавить. Вы увидите, что в библиотеке классов добавлен узел с шаблоном t4. Когда вы раскройте узел, у вас есть классы C# (или VB) для ваших объектов.

Источник: http://sumitmaitra.wordpress.com/2011/07/14/entity-framework-and-ms-web-stack-of-love-first-steps/

Это дало мне слой доступа к данным, функционирующих большой с ООП.

Вот окончательный код (который работает):

 // Note that ModelsContainer derives from DbContext 
     ModelsContainer context = new ModelsContainer(); 

     var weapons = context.Items.OfType<Weapon>(); 

     foreach (var weapon in weapons) 
     { 
      Console.WriteLine(weapon.Name + ":" + weapon.Attack); 
     } 

     var armours = context.Items.OfType<Armour>(); 

     foreach (var armour in armours) 
     { 
      Console.WriteLine(armour.Name + ":" + armour.Defense); 
     } 
1

Используйте код EntityFramework. Прежде всего, чтобы получить данные для таблицы, а затем использовать функцию кеша ASP.NET MVC для хранения данных, связанных с конечным пользователем, в кеше на удаленном компьютере конечного пользователя. Таким образом, вы можете избежать попыток сервера для извлечения данных из каждой таблицы для каждого события на стороне конечного пользователя.

http://weblogs.asp.net/scottgu/archive/2010/01/27/extensible-output-caching-with-asp-net-4-vs-2010-and-net-4-0-series.aspx

+0

Спасибо. его хорошая вещь, чтобы знать! –