由于在单个应用程序中将 SimpleMembershipProvider 集成到单个 DbContext 中时存在有关问题的评论,因此我将通过创建两个单独的项目来解决这个问题,方法是使用 EF 实现松散耦合的 ORM 方法,其中一个是初始化包含 4 个数据库的类库表加上 UserProfile 表和 App 项目本身。如果您在类库中遇到 SMP 问题,请改用 vs2012 创建一个空的 MVC4 Web 应用程序。
这最终会创建两个 DbContext,您必须在其中为您的 DAL(WebApi、Repo、IoC 等)使用一些架构模式,而这反过来又可以成为其自己的可重用类库。只需确保使用 UserId FK 在两个应用程序/项目中的数据模型之间提供参照完整性。
1.创建两个项目;类库和 Web 应用程序 MVC4
SMPIdentity 项目(类库)
- dbo.UsersInRoles
- dbo 角色
- dbo.Memberships
- dbo.OAuthMembership
- dbo.UserProfile
应用项目(网络应用)
2.SMPIdentity类库项目
您必须使用控制台管理器安装这些 nuget 包,SimpleMembershipProvider (4.0) 才能工作:
PM> Install-Package Microsoft.AspNet.WebPages.OAuth
PM> Install-Package EntityFramework -Version 5.0.0
PM> Install-Package Microsoft.AspNet.Mvc -Version 4.0.30506
PM> Install-Package WebMatrix.WebData
3.SMPIdentity 类库中的Enable-migrations
4.在SMPIdentity项目中添加.config文件:
<connectionStrings>
<add name="SMPConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SMP;Integrated Security=True;MultipleActiveResultSets=False" />
</connectionStrings>
<system.web>
<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
<providers>
<clear />
<add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
</providers>
</roleManager>
<membership defaultProvider="SimpleMembershipProvider">
<providers>
<clear />
<add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
</providers>
</membership>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
</system.web>
6.创建一个空的 DbContext 类 ( SMPEntities.cs
) 来存储 SimpleMembershipProvider 表和 UserProfile 表,如果您希望向 UserProfile 模型添加其他属性。如果不只是留空
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace SMPIdentityMVC4
{
public class SMPContext : DbContext
{
public SMPContext()
: base("name=SMPConnection")
{
}
//add DbSet<UserProfile> Users if you want custom properties
//dbo.UserProfile will only have int UserId & string UserName
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
}
//Create if you want custom properties
[Table("UserProfile")]
public class UserProfile
{
//...ctors here
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
[ScaffoldColumn(false), Required]
public string ImageUrl { get; set; }
[DisplayFormat(DataFormatString = "{0}")] //{0:d} or {0:D}
[DataType(DataType.DateTime), ScaffoldColumn(false)]
public DateTime DateJoined { get; set; }
}
}
6.在 SMPIdentity 类库中从 CF 迁移创建数据库:
PM> Add-migration SMPInitial
7.Configuration.cs
在 Migrations 文件夹中编辑并System.Web
在需要时添加对 Project 的引用:
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Web.Security;
using WebMatrix.WebData;
internal sealed class Configuration : DbMigrationsConfiguration<SMPContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(DomainContext context)
{
WebSecurity.InitializeDatabaseConnection(
"SMPConnection",
"UserProfile",
"UserId",
"UserName", autoCreateTables: true);
if (!WebSecurity.UserExists("yardpenalty"))
WebSecurity.CreateUserAndAccount(
"yardpenalty",
"password",
new
{
Email = "yardpenalty@email.com",
ImageUrl = "/Content/Avatars/yardpenalty.jpg",
DateJoined = DateTime.Now,
},
false);
if (!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
if (!Roles.RoleExists("Blogger"))
Roles.CreateRole("Blogger");
}
8. 初始化和填充 SMP 数据库中的表
9. 创建实际 Web 应用程序并执行以下操作:
将参考或整个 SMPIdentity 项目添加到实际的 MVC4 Web 应用程序
为 SMP 添加 connectionString,因此有两个 connectionString;SMPConnection & DefaultConnection
为 DbContext 选择架构模式,一切就绪!您可以在 SMP 项目完好无损的情况下在 Web 应用程序上使用代码优先迁移
控制器中的简化示例代码(依赖注入?):
public class studentController : Controller
{
private readonly SimpleMembershipRepository _accounts = null;
private readonly StudentRepository _students = null;
public StudentController(IRepository students, IRepository account)
{
_accounts = accounts;
_students = students;
}
}
现在您有一个帐户数据库,如果您愿意,它包括整个域的 SimpleMembershipProvider!创建一个 WebApi 控制器来访问 Simple Membership Provider 数据库以便于访问。