c# - Entity Framework 可扩展框架

标签 c# entity-framework entity-framework-4.1 ef-code-first

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

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/

相关文章:

entity-framework - Entity Framework Code First - 减少使用 .Load() 和 .Local 的往返

asp.net - 无法添加方法 OnModelCreating

javascript - 使用 C# 和 Selenium WebDriver 渲染页面时禁用 Chrome 中的 JavaScript

c# - 在 WPF C# 中将光标焦点设置为可编辑组合框

c# - Autofixture Fixture.Build().With() 在相​​同的属性名称上

c# - 如何在 LINQ to entities 中使用 Date 函数?

c# - 通用接口(interface)的通用列表不允许,任何替代方法?

.net - Dotnet EF 更新不生成数据库

c# - 如何在不加载表的所有数据的情况下计算事件和非事件统计信息?

sql - 数据库 'master' 中的 CREATE DATABASE 权限被拒绝。 MVC EF 4.1 Codefirst 入门