EF5 MVC4子级/父级导航属性

本文关键字:导航 属性 MVC4 子级 EF5 | 更新日期: 2023-09-27 18:25:07

我有3个类,它们可以是多个父类的子类。有没有一种方法可以在不为每个可能的父类添加导航属性的情况下找到子类的ID/Type?

例如:我正在制作一款基于浏览器的太空战略游戏。父类(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"列(这是一种糟糕的做法,不是吗?)。

我希望能够提取Parent的对象,这样我就可以访问孩子的Id等信息,这样我就能看到他们的兄弟姐妹是什么,我希望尽量避免为他们父母的每一种可能性设置导航属性。例如,在资源类中,我需要能够查看父级有多少结构船舶,以便计算最大金属存储和金属聚集率。因此,资源/结构/船舶都是一个父项下的兄弟项,该父项可能是舰队/小行星/行星

我希望这一切都是合理的,这不是一个太荒谬的要求:)。有人能给我指出正确的方向吗?

澄清类结构的编辑:

OwnableSpaceObject具有资源/船舶/结构作为属性(每个都是自己的类,从零继承,船舶和结构是ICollections)

舰队/小行星/行星从OwnableSpaceObject 继承

所以基本上我有:

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

这些类别中的每一个都有一个结构和船舶的ICollection。实体框架在Structure/Ship表中为从OwnableSpaceObject继承的每个类生成一列,如"Asteroid_Id"、"Planet_Id"answers"Fleet_Id"。

EF5 MVC4子级/父级导航属性

通常,如果资源/结构/船舶继承自等接口

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