我已经看过Generics and inheritance in C#,但我不确定它是否完全相同。
假设我的数据库中有一个用户实体:
public abstract class User{ ... }
我有一些派生自它的类:
public class NormalUser : User { ... }
public class SuperUser : User { ... }
对于两个派生类,我的上下文中都有适当的DbSet
(显然不适用于User
基类)。这里没有问题。
现在,我想创建一个名为Attachment
的其他对象,所有用户都可以拥有。但这是一个抽象类。它不会单独实现,但我知道它将由User
的某个子类创建。我可以直接尝试User
属性,但不是,在派生类中,我想要一个强类型的用户属性,映射到NormalUser
或SuperUser
(或任何其他)。
我最终是这样的:
public abstract class Attachment<T> where T : User
{
...
public long CreatorId { get; set; }
public virtual T Creator { get; set; }
}
我知道实体框架不支持泛型,但我没有Attachment
本身作为实体。现在,我已经创建了一个派生类,根据需要替换了泛型:
public class NormalUserAttachment : Attachment<NormalUser> {
public string SomeExtraDataJustForNormalUserAttachments{get;set;}
...
}
现在,我有一个派生自Attachment
的新类,并将NormalUser
类型的属性作为User
类型。
但是,当我尝试运行应用程序时(启用了自动迁移),我收到错误,dbo.NormalUserAttachment
不存在。
为什么会这样?我不是直接使用泛型类型,我使用的是从泛型类型派生的非泛型类型,但所有泛型都替换为实际类型。它仍然不受支持,还是其他什么?我在实体框架6.1.3,代码优先。