在许多项目中,我必须制作一个包含用户的表并实现基于用户的标准功能,例如身份验证、保存等。因此我决定制作一个包含这些功能的类库,例如:
public class User
{
public int? Id {get;set;}
public string UserName {get;set;}
public string Password {get;set;}
}
public class MyDbContext : DbContext
{
public DbSet<User> {get;set;}
}
public class UserService
{
public MyDbContext Context {get;set;} // will be initialized in constructor
public User GetByUserName(string username)
{
return (from s in Context.Users where s.UserName.Equals(username) select s).SingleOrDefault();
}
// etc...
}
现在,当我启动一个新的 Mvc 项目时,我添加此库并使用自定义模型扩展 DbContext。问题是我不知道如何使用一些附加字段扩展用户表,例如:
public class MyUser : User
{
public bool IsApproved {get;set;}
}
public class CustomDbContext : MyDbContext
{
public DbSet<SomeOtherModel> {get;set;}
// problem: override DbSet in MyDbContext with class MyUser?
//public DbSet<MyUser> {get;set;}
}
在这种情况下,我还需要覆盖 DbSet<User>
MyDbContext
的。如果我删除 DbSet<User>
在图书馆我的UserService
类(class)不再工作了。关于如何制作可扩展框架有什么想法吗?
最佳答案
你可以使用泛型(我没有测试过,只是一个想法):
public abstract class UserDbContext<TUser> : DbContext where TUser : User
{
public DbSet<TUser> Users {get;set;}
}
然后继承:
public class CustomDbContext : MyDbContext<MyUser>
在UserService
中也有相同的泛型:
public abstract class UserService<TUser> where TUser : User
{
public UserDbContext<TUser> Context {get;set;} // will be initialized in constructor
public TUser GetByUserName(string username)
{
return (from s in Context.Users where s.UserName.Equals(username) select s).SingleOrDefault();
}
// etc...
}
关于c# - Entity Framework 可扩展框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9465853/