0

我有 3 个类可以是众多父类的子类。有没有办法在不为每个可能的父类型添加导航属性的情况下找到孩子的父类的 ID/类型?

例如:我正在制作一个基于浏览器的太空策略游戏。父类(Fleet、Asteroid、Planet)继承自此处定义的名为“OwnableSpaceObject”的类:

public abstract class OwnableSpaceObject : SpaceObject
{
    public int? UserId { get; set; }
    public int? ResourcesId { get; set; }

    [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }

    [ForeignKey("ResourcesId")]
    public virtual Resources Resources { get; set; }

    public virtual ICollection<Structure> Structures { get; set; }
    public virtual ICollection<Ship> Ships { get; set; }
}

鉴于每个子类(Resources、Structure、Ship)都可以属于从该基类继承的任何一个父类,Entity Framework 为它们提供了诸如“Asteroid_Id”、“Planet_Id”和“Fleet_Id”之类的列,我考虑到如果我添加更多父类,我将在表中拥有 3-20 多个可空的“Parent_Id”列(这是不好的做法,不是吗?)。

我希望能够拉出父母的对象,以便我可以从孩子那里访问诸如 Id 之类的东西,这样我就可以看到他们的兄弟姐妹是什么,并且我想尽量避免为他们父母的每一种可能性放置一个导航属性。这方面的一个例子是,在资源类中,我需要能够查看父级有多少结构船舶,以便计算最大金属存储和金属收集率。所以Resources/Structures/Ships都是一个父级下的兄弟姐妹,可能是Fleet/Asteroid/Planet

我希望这一切都是有道理的,并且它的请求不会太荒谬:)。谁能指出我正确的方向?

编辑以澄清类结构:

OwnableSpaceObject具有Resources/Ships/Structures作为属性(每个都是它们自己的类,从无继承,Ships 和 Structures 是 ICollections)

Fleet/Asteroid/Planet继承自 OwnableSpaceObject

所以基本上我有:

public Fleet : OwnableSpaceObject { //fleet specific stuff }
public Asteroid: OwnableSpaceObject { //asteroid specific stuff }
public Planet: OwnableSpaceObject { //planet specific stuff }

这些类中的每一个都有一个 ICollection of Stuctures 和 Ships。实体框架为从 OwnableSpaceObject 继承的每个类在 Structure/Ship 表中创建一个类似“Asteroid_Id”、“Planet_Id”和“Fleet_Id”的列。

4

1 回答 1

1

一般来说,如果 Resources/Structures/Ships 继承自一个接口,例如

public interface IResourceItem
{
   double MaxMetalStorage{get;}
   double MetalGatherRate{get;}
}

您可以这样修改父类

public class Resources
{
    public IList<IResourceItem> ResourceItems {get; set;}

    public double GetTotalMetalStorage(){
        return this.ResourceItems.Sum(x => x.MaxMetalStorage);
    }
}
于 2013-07-25T18:29:27.283 回答