实体框架中泛型的解决方法

时间:2014-11-26 16:55:59

标签: c# .net entity-framework generics

我知道EntityFramework中不支持泛型。

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

public class Foo<T> {
   //...
}

我想知道是否存在解决方法。

我有一个BaseUser课程:

public class BaseUser {
     [Key]
     public int Key { get; set; }

     [Required]
     public string Username { get; set; }

     [Required]
     public string Password { get; set; }
}

我的所有安全逻辑都围绕着这个BaseUser移动。它还使用了一些其他实体,例如:ApplicationClient

ApplicationClient取决于BaseUser实体:

public class ApplicationClient {
     //... Other properties

     [ForeignKey("User")]
     public int UserKey { get; set; }
     public virtual BaseUser User { get; set; }
}

到目前为止一切正常。

但是,我的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; }
}

现在,当EF构建模型时。该类型将被解析,并且会看到需要MyUser的引用,而不是BaseUser

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

还有另一种方法可以实现我想要做的事情(或者更好的方法)?

2 个答案:

答案 0 :(得分:0)

我对实体不太熟悉,因为我通常更喜欢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;}
}

这样您的客户可以根据需要添加任意数量的属性。您必须检查重复的密钥,这很难,因此您的UserProperty列表最好与用户公开访问它的方法保持私密。

2-忘了它。如果需要,您的客户可以将您的用户映射到其用户的一对一属性。

class User {
    public int Id{get;set;}
}

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

答案 1 :(得分:0)

实体框架确实支持所有规范继承策略:每个类层次结构的表,每个类的表和每个具体类的表,但是您也必须映射新的派生类。请在此处查看示例:http://weblogs.asp.net/ricardoperes/entity-framework-code-first-inheritance

相关问题