基于基类属性的派生类型

时间:2018-11-08 22:34:18

标签: c# entity-framework-core ef-core-2.0 ef-core-2.1

我有一个基类和一些派生类:

public class Item
{
    public (int itemId, string itemName)
    {
        ItemId = itemId;
        ItemName = itemName;
    }    
    public int ItemId { get; set; }
    public string ItemName { get; set; }
}

public class Weapon : Item
{
    public Weapon(int itemId, string itemName) : base(itemId, itemName) 
    {
        if(itemId != 1) throw InvalidObjectType;
    }
    //custom properties
}

public class Armor : Item
{
    public Armor(int itemId, string itemName) : base(itemId, itemName) 
    {
        if(itemId != 2) throw InvalidObjectType;
    }
    //custom properties
}
//etc

问题是,我有一个基类,并且可以实例化该基类,但是根据typeId,我想强制使用一个特定的类。假设在A的构造函数中,如果typeId = 0接受基类,否则抛出。如果typeId = 1,则强制为B类,否则抛出;否则为false。这是一个好方法吗?我想要这个,因为类型来自数据库,所以我可以基于此创建正确的实例(当然,这将通过if语句完成),但是我想确保代码强制执行该业务规则。我是否以一种好的方式来解决这个问题?或者我该怎么做。 我将C#与EF Core配合使用(可以在模型配置中设置此规则吗???)

编辑:

Category(categoryId, category)
Item (id, name, categoryId, etc)
Weapon (itemId, dmg, maxenhancelevel, etc)

因此,根据返回项目的类别,我创建一个派生类或基类(取决于)。

找到有关如何使用EF Core进行映射的答案:https://weblogs.thinktecture.com/pawel/2018/05/entity-framework-core-inheritance-tpt-is-not-supported-is-it-part-1-code-first.html

1 个答案:

答案 0 :(得分:2)

一种方法是将所有类放在一个单独的项目中,并在构造函数上使用internal修饰符来强制它们的生成方式:

public class BaseClass
{
  internal BaseClass() { }
}
public class Class1:BaseClass
{
  internal Class1() : base() { }
}

public class Class2 : BaseClass
{
  internal Class2() : base() { }
}

然后,在同一项目中创建一个静态工厂方法以返回正确的类:

public static BaseClass ClassFactory(int typeId)
{
  switch(typeId)
  {
    case 0:
      return new BaseClass();
    case 1:
      return new Class1();
    case 2:
      return new Class2();
    default:
      throw new ArgumentException("Unrecoginzed typeId");
  }
}

通过使用internal,可以防止从项目外部创建这些类。