我有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 + null-able'Parent_Id'列(这是不好的做法,不是吗?)。
我希望能够拉出Parent的对象,以便我可以从孩子那里访问Id这样的东西,这样我就可以看到他们的兄弟姐妹是什么了,我想尽量避免为他们父母的每一种可能性设置导航属性。这方面的一个例子是,在资源类中,我需要能够看到父有多少结构和 Ships 才能计算出来Max Metal存储和金属收集率。所以资源/结构/船舶都是父母一方的兄弟姐妹,可能是 Fleet / Asteroid / Planet 。
我希望这一切都有意义,并且它的请求不是太荒谬:)。有人能指出我正确的方向吗?
编辑澄清班级结构:
OwnableSpaceObject 将 Resources / 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。对于从OwnableSpaceObject继承的每个类,实体框架在Structure / Ship表中创建类似“Asteroid_Id”,“Planet_Id”和“Fleet_Id”的列。
答案 0 :(得分: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);
}
}