在许多项目中,我必须创建一个包含用户的表,并实现标准的基于用户的功能,如身份验证、保存等。因此,我决定创建一个包含这些功能的类库,例如:
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;}
}在这种情况下,我还需要覆盖MyDbContext的DbSet<User>。如果我删除库中的DbSet<User>,我的UserService类将不再工作。有什么想法可以做一个可扩展的框架吗?
发布于 2012-02-27 21:39:51
你可以使用泛型(我还没有测试过,只是一个想法):
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...
}发布于 2012-02-27 21:36:56
不要从User继承,而是让User成为一个分部类并以这种方式扩展User。只有当你的库只是一组源文件,而不是编译成程序集时,这才能起作用。
编辑:
另一种选择是不在框架中定义dbcontext,而是使用应用程序项目中的库类来定义它。然后,您可以在框架中调用初始化函数来执行所需的映射,并从OnModelCreating调用它。
发布于 2012-02-27 21:50:28
您可以始终使用组合,并让MyUser包含用户属性。然后,您将拥有一个具有DbSet的全新DbContext。
这将在数据库中创建两个表,但这可能是最简单的。(免责声明:没有尝试过,您可能会遇到跨程序集问题)
https://stackoverflow.com/questions/9465853
复制相似问题