C# 实体框架中泛型的变通方法
我知道EntityFramework不支持泛型 例如,此类将不被接受或映射: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"
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;}
}