首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架可扩展框架

实体框架可扩展框架
EN

Stack Overflow用户
提问于 2012-02-27 21:31:16
回答 3查看 540关注 0票数 2

在许多项目中,我必须创建一个包含用户的表,并实现标准的基于用户的功能,如身份验证、保存等。因此,我决定创建一个包含这些功能的类库,例如:

代码语言:javascript
复制
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。问题是我不知道如何用一些额外的字段来扩展用户表,例如:

代码语言:javascript
复制
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;}
}

在这种情况下,我还需要覆盖MyDbContextDbSet<User>。如果我删除库中的DbSet<User>,我的UserService类将不再工作。有什么想法可以做一个可扩展的框架吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-27 21:39:51

你可以使用泛型(我还没有测试过,只是一个想法):

代码语言:javascript
复制
public abstract class UserDbContext<TUser> : DbContext where TUser : User
{
  public DbSet<TUser> Users {get;set;}
}

然后继承:

代码语言:javascript
复制
public class CustomDbContext : MyDbContext<MyUser>

UserService中相同的泛型

代码语言:javascript
复制
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...
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-27 21:36:56

不要从User继承,而是让User成为一个分部类并以这种方式扩展User。只有当你的库只是一组源文件,而不是编译成程序集时,这才能起作用。

编辑:

另一种选择是不在框架中定义dbcontext,而是使用应用程序项目中的库类来定义它。然后,您可以在框架中调用初始化函数来执行所需的映射,并从OnModelCreating调用它。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 21:50:28

您可以始终使用组合,并让MyUser包含用户属性。然后,您将拥有一个具有DbSet的全新DbContext。

这将在数据库中创建两个表,但这可能是最简单的。(免责声明:没有尝试过,您可能会遇到跨程序集问题)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9465853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档