C# 实体框架中泛型的变通方法

C# 实体框架中泛型的变通方法,c#,.net,entity-framework,generics,C#,.net,Entity Framework,Generics,我知道EntityFramework不支持泛型 例如,此类将不被接受或映射: public class Foo<T> { //... } 我所有的安全逻辑都围绕这个BaseUser。它还使用一些其他实体,例如:ApplicationClient ApplicationClient依赖于BaseUser实体: public class ApplicationClient { //... Other properties [ForeignKey("User"

我知道EntityFramework不支持泛型

例如,此类将不被接受或映射:

public class Foo<T> {
   //...
}
我所有的安全逻辑都围绕这个
BaseUser
。它还使用一些其他实体,例如:
ApplicationClient

ApplicationClient
依赖于
BaseUser
实体:

public class ApplicationClient {
     //... Other properties

     [ForeignKey("User")]
     public int UserKey { get; set; }
     public virtual BaseUser User { get; set; }
}
到目前为止,这一切都很好

但是,my API的使用者可以从
BaseUser
扩展并添加更多属性:

public class MyUser : BaseUser {
     public string Email { get; set; }
}
这会把一切都搞砸,因为
ApplicationClient
的外键应该是对
MyUser
表的引用,而不是
BaseUser

BaseUser
表不应存在,应替换为
MyUser

因此,合乎逻辑的解决方案是:

public class ApplicationClient<U> where U : BaseUser {
    //... Some other properties

    [ForeignKey("User")]
    public int UserKey { get; set; }
    public virtual U User { get; set; }
}
公共类应用程序客户端,其中U:BaseUser{
//…其他一些属性
[外键(“用户”)]
公共int用户密钥{get;set;}
公共虚拟U用户{get;set;}
}
现在,当EF构建模型时。类型将被解析,它将看到需要引用
MyUser
,而不是
BaseUser

不幸的是,EF不支持泛型,因此抛出异常


有没有其他方法来完成我想做的事情(或者更好的方法)?

我不太熟悉entity,因为我通常更喜欢NHibernate,它确实支持到不同表的继承映射

考虑到EF的局限性,我能想到的最佳解决方案是:

1-有一个具有键/值对列表的用户

class User {
    public int Id{get;set;}
    List<UserProperty> UserProperties {get;set;}
}

class UserProperty{
    public int Id{get;set;}
    public User User {get;set;}
    public string Key {get;set;}
    public string Value {get;set;}
}

实体框架确实支持所有规范继承策略:每个类的表层次结构、每个类的表和每个具体类的表,但您也必须映射新的派生类。请参见此处的示例:

class User {
    public int Id{get;set;}
    List<UserProperty> UserProperties {get;set;}
}

class UserProperty{
    public int Id{get;set;}
    public User User {get;set;}
    public string Key {get;set;}
    public string Value {get;set;}
}
class User {
    public int Id{get;set;}
}

//Client Code
class ClientUser {
    public int Id{get;set;}
    public User ApiUser {get;set;}
}