面向对象数据库模型

时间:2011-12-26 17:49:33

标签: c# asp.net-mvc entity-framework entity-framework-4 ado.net-entity-data-model

更新代码!

我正在使用ASP.NET MVC 3开发Web应用程序,我想使用“ADO.NET实体数据模型”创建面向对象的列表。

我使用“ADO.NET实体数据模型”按实体框架“Code-First”创建模型    生成了一个数据库之后我使用“Reverse”生成了一个完整的DAL    engineer 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”对象就像使用抽象类一样 - 它只会被其派生类使用 - “Weapon”,“Armor” ,“珠宝”等。

包含导航属性的武器相应的项目,以及它自己的属性(在这种情况下为Damage)。

ConcrateItem是玩家拥有的物品。这意味着它包含一个导航属性(就像指针一样使用),加上该项目实例升级的升级次数,因为它是单独的每个项目,而不是在所有这类项目之间共享。

我最初做的是将武器和护甲类型链接到适当的项目 类型,所以我可以访问项目基本属性,如果我遍历武器表或Armor表,但问题是我想一次迭代所有项目,从这一点,以便能够得到一个独占属性,而不是遍历包含从Item派生的特定类的每个表。

有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用EntityFramework CodeFirst检索表的数据,然后使用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

答案 1 :(得分:1)

我已经考虑过这样做的方法,之后我意识到数据库中的自动生成类是一个糟糕的工具,我改为使用:

  • 右键单击并选择“添加代码生成项”。
  • 从“添加新向导”中选择ADO.NET DBContext Generator。你会 看到它给出了Model1.tt(t4模板)名称。
  • 如果需要,请更改名称,然后选择添加。你会看到下 使用t4模板添加节点的类库。当你 展开您拥有实体的C#(或VB)类的节点。

来源: http://sumitmaitra.wordpress.com/2011/07/14/entity-framework-and-ms-web-stack-of-love-first-steps/

这给了我数据访问层,它在OOP中运行良好。

以下是最终代码(正常工作):

        // 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);
        }