实体框架 - 如何创建没有泛型的基本实体

本文关键字:实体 泛型 创建 框架 何创建 | 更新日期: 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>
{
}