我的情况:
public class EntityBase
{
public int ID { get; set; }
[Required()]
public string Name { get; set; }
//And this is what is getting me
//I want a "Type" enum
}
然后,派生的类将具有不同的枚举,它们将分配给Type。
public class AnimalEntity : EntityBase
{
//Type would have an 'animal type' value: Land, Sea or Air
//Implementation code would do something like:
// myAnimal.Type = AnimalType.Land
}
public class PersonEntity : EntityBase
{
//Type would have a 'person type' value: Doctor, Lawyer or Engineer
//Implementation code would do something like:
// myPerson.Type = PersonType.Lawyer
}
public class MonsterEntity : EntityBase
{
//Type would have a 'monster type' value: Goblinoid, Undead
}
所以,最大的问题是我要做什么,对吗?我正在尝试创建一个基础存储库类,该类将返回按类型分组的实体。我所有的实体都会有某种“类型”,我想创建一个通用的“按类型分组”。
public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : EntityBase
{
//Our common GetAsync, GetByIdAsync, and all our other CRUD
//And then something like this:
public IEnumerable<GroupedData<string, T>> GetGroupedByType(string searchTerm)
{
var entities =
from s in DbSet
where (searchTerm == null || s.Name.ToLower().Contains(searchTerm))
group s by s.Type into g
select new GroupedData<string, T> { Key = g.Key.ToString(), Data = g };
return (entities);
}
}
当T为AnimalEntity时,我将获得带有相应实体的组Land,Sea和Air。对于PersonEntity,我将获得Doctor,Lawyer,Engineer组。
如果我的方法/设计无效或不理想,请告诉我。
枚举(请原谅)是二等公民,因此您可能想到的第一件事将不起作用:
class EntityBase<T> where T : enum {
public T Type { get; set; }
}
不幸的是,它无法编译,您可能会考虑将其替换enum
为基类:
class EntityBase<T> where T : EntityTypeBase {
public T Type { get; set; }
}
实施所需的EntityTypeBase
一切以使其适应(==
以及!=
操作员,IConvertible
界面和其他样板)。这是很多代码,您还需要在EF中进行管理(否则,除非将内存中的所有内容作为对象加载,否则您将无法在查询中使用此类属性)。您也可以强制使用enum
s(带有运行时检查),但这会中断EF中SQL代码的生成。
在这种情况下,我建议使用EF知道并理解的类型。您可以使用字符串(如果需要)或整数(如本例所示):
class EntityBase
public virtual int Type { get; set; }
}
在派生类中:
class AnimalEntity : EntityBase {
public override int Type {
get { return base.Type; }
set {
if (!Enum.IsDefined(typeof(AnimalType), value))
throw new ArgumentException();
base.Type = (int)value;
}
}
}
这样,您仍然可以使用PersonType.Layer
并AnimalType.Land
保持一些类型的安全性。当然,您需要使枚举保持同步,以确保没有重复的值(否则group by
将不起作用)。
最后,请考虑使用...另一个实体。如果您还有另一个表EntityType
:
ID名称适用于 0下岗人 1个程序员 2陆生动物 ...
在设置器中需要做的是检查类型是否适用,并且可能没有几个方便的类可以按类型对它们进行分组:
public static class PersonType {
public static EntityType Lawyer { get { ... } }
public static EntityType Programmer { get { ... } }
}
IMO的伸缩性更好(更容易添加新项目,以后您可以将某些行为委托给EntityType
项目),并且比硬编码常量更安全(因为完整性由DB引擎本身授予)。当然,要付出的代价是在EntityType
表中进行搜索的额外开销(除非您使用某些缓存机制)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句