实体框架 - 如何创建没有泛型的基本实体
本文关键字:实体 泛型 创建 框架 何创建 | 更新日期: 2023-09-27 18:31:44
有没有办法编写一个基本实体,其中主键的类型不是使用泛型指定的?
例如,到目前为止,我一直在这样做:
public class BaseUniqueEntity<T> where T : IComparable, IComparable<T> {
[Key]
public T Key{ get; set; }
}
这在当时很好,但现在给我带来了设计问题。例如,在编写通用存储库时,我有义务指定两个类型约束:
public interface IRepository<K, E>
where K : IComparable, IComparable<K>
where E : BaseUniqueEntity<K>
我只想指定实体的类型E
,但我需要K
类型来指定where E : BaseUniqueEntity<K>
约束。
我无法制作 object 类型的Key
,因为在为我创建表时它会搞砸。
所以我想到从BaseUniqueEntity
中删除泛型.有没有办法做到这一点?我没有想法,我对实体框架很陌生。
有没有办法编写一个基本实体,其中主键的类型不是使用泛型指定的?
为什么必须编写基本实体?从表面上看,你所做的只是尝试在每个实体上强制实施一个键,这甚至可能对类型没有意义(EF 支持的组合键可能更有意义)。无论如何,无论如何,实体都需要 Key 属性,那么究竟在强制实施什么?
没有规则说所有内容都必须从基类继承。我的建议:如果你认为调用者总是定义密钥类型没有意义,那么只需编写定义自己的密钥的类,使用对它们有意义的类型。
如何保留通用 IRepository 接口并定义另一个接口作为默认键(int、guid 等)的快捷方式像这样:
public interface IRepository<K, E>
where K : IComparable, IComparable<K>
where E : BaseUniqueEntity<K>
{
}
public interface IRepository<E> : IRepository<int, E>
where E : BaseUniqueEntity<int>
{
}
定义具体存储库时:
public class UserRepository<User>
{
}