我具有基于.net core 3.0构建的其余API的通用结构
这是我的通用实体代码。
public interface IFullAuditedEntity
{
object Id { get; set; }
}
public abstract class FullAuditedEntity<T> : IFullAuditedEntity where T : struct
{
public IFullAuditedEntity() { }
[Key]
public virtual T Id { get; set; }
object Entity.Id
{
get { return Id; }
set
{
Id = (T)value;
}
}
}
现在,如果我的实体具有 int主键,则此结构对我来说很好。
但是如果我必须使用 string作为主键,它会给我泛型错误。参见下面的实体。
[Table(name: "Status")]
public class Status : FullAuditedEntity<string>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[StringLength(03)]
public override string Id { get; set; }
[StringLength(03)]
public string Type { get; set; }
}
有关更多信息,请参见添加的快照。
我尝试通过Nullable,如其他一些SO答案所建议的那样,但这对我不起作用,因此,我们将不胜感激任何帮助。
答案 0 :(得分:4)
有一个约束条件:
public abstract class Entity<T> : IEntity where T : struct
所以string
不是struct
的类型,string
是引用类型。 What's the difference between struct and class in .NET?
约束将类型参数的功能告知编译器 一定有。没有任何约束,类型参数可以是任何 类型。编译器只能假定System.Object的成员, 是任何.NET类型的最终基类。了解更多信息, 参见Why use constraints。
您可以删除此约束以避免发生此错误,现在您的Id
可以是任何类型:
public abstract class Entity<T> : IEntity
作为string
类型密钥的替代方法,如果它适合您的情况,则可以创建T
类型的Guid
。如果类型可以为Guid
,则可以避免删除约束:
public abstract class FullAuditedEntity<T> : IFullAuditedEntity where T : struct
{
// ... The code is omitted for the brevity
}
和您的实体:
[Table(name: "Status")]
public class Status : FullAuditedEntity<string>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[Guid]
public override Guid Id { get; set; }