更新代码!
我正在使用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);
}
}
从现在开始,这是我所拥有的,我不满意,即使我认为这是不必要的。
我目前的模特关系(我不满意):
包含不同项的项基类,注意使用“Item”对象就像使用抽象类一样 - 它只会被其派生类使用 - “Weapon”,“Armor” ,“珠宝”等。
包含导航属性的武器相应的项目,以及它自己的属性(在这种情况下为Damage)。
ConcrateItem是玩家拥有的物品。这意味着它包含一个导航属性(就像指针一样使用),加上该项目实例升级的升级次数,因为它是单独的每个项目,而不是在所有这类项目之间共享。
我最初做的是将武器和护甲类型链接到适当的项目 类型,所以我可以访问项目基本属性,如果我遍历武器表或Armor表,但问题是我想一次迭代所有项目,从这一点,以便能够得到一个独占属性,而不是遍历包含从Item派生的特定类的每个表。
有谁知道如何实现这一目标?
答案 0 :(得分:1)
使用EntityFramework CodeFirst检索表的数据,然后使用ASP.NET MVC缓存功能将最终用户相关数据存储在远程终端用户计算机的缓存中。通过这种方式,您可以避免服务器跳闸,从最终用户端的每个事件中检索每个表中的数据。
答案 1 :(得分:1)
我已经考虑过这样做的方法,之后我意识到数据库中的自动生成类是一个糟糕的工具,我改为使用:
来源: 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);
}