我有基于 EF Code First 的模型,我想将它们与默认的 MembershipProvider 一起使用,但我不知道如何正确编写模型,因此在进行更改时它不会删除我在重新创建表时的所有数据到模型。
6 回答
看看这个项目
http://codefirstmembership.codeplex.com/
它具有用户和角色的实体类,以及角色提供者和成员资格提供者的实现。如果您在数据上下文类中包含用户和角色,则将在您的数据库中创建表。
你的问题有两个部分。
- 如何首先将 asp.net 会员 API 与 EF 代码一起使用?
- 模型更改时如何保留现有数据?
至于如何在模型更改时保留现有数据,就 EF 4.0/asp.net mvc 3 而言,尚不支持数据库迁移。您将不得不迁移到支持数据库迁移的 asp.net mvc 4.0/EF 4.3 或使用类似的替代方案,但它仍然是 beta 版本。
scott gu 博客中的 asp.net mvc 4.0 数据库迁移
现在谈到如何首先使用带有 EF 代码的 asp.net 会员提供程序。有几个挑战:
我们不能/不应该与 asp.net 成员提供程序表进行联接。它不推荐,所以我的建议是为 asp.net 成员提供程序类创建一个“适配器类”。例如:
public class UserAdapter { // all user related attributes. Not stored in membership schema, but your schema public string UserProxyName; // some attributes stored in membership schema [NotMapped] public string Email { get { Membership.GetUser(UserProxyName).Email; } } // some attributes stored in membership schema and not in your schema [NotMapped] public string[] UserRoles { get { return Roles.GetRolesForUser(UserProxyName); } } }
现在为了更新信息,您可以在模型本身中编写一些函数,但是我建议创建一个具有存储库设计模式的 UserRepository来处理用户 CRUD 操作。
第二个挑战是如何在第一次运行时创建数据库。随着播种成为一个问题,如果您想播种用户信息,那么单独运行 aspnet_regsql 效率不高,因为在播种发生之前需要成员模式。我遇到了这篇不错的文章,经过一些微调,它对我有用:
目前(EF 4.1 CTP)EF Code First 没有该选项。如果您对模型进行了更改,它总是会删除一个表。
更新:
EF 4.1 RTM 允许您创建自定义数据库初始化程序并指定创建数据库对象和数据种子。
如果您使用的是 SQL Server,请检查以下内容:
http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/
还有我的库,它基本上允许您定义应该如何配置几乎所有内容,包括:键类型、上下文对象的位置以及用户/角色实体的位置。可使用抽象基类或接口进行扩展。开箱即用的存储库模式/工作单元/IoC 容器也可以很好地工作。
在我的 DbContext.cs 文件中,我有一个 Seed 函数,我调用它ApplicationServices.InstallServices()
来将 ASP.NET Membership 安装到我的数据库中。现在,每当我的初始化程序删除数据库时,它都会再次重新创建 ASP.NET Membership 架构。
public class PanelInitializer : DropCreateDatabaseAlways<PanelContext>
{
protected override void Seed(PanelContext context)
{
//Install ASP.NET Membership
ApplicationServices.InstallServices(SqlFeatures.Membership | SqlFeatures.RoleManager);
new List<Panel>
{
应用服务类
using System.Configuration;
using System.Data.SqlClient;
using System.Web.Management;
namespace Lansw.Panels.DataAccess.Contexts
{
public class ApplicationServices
{
readonly static string DefaultConnectionString = ConfigurationManager.AppSettings["DefaultConnectionString"];
readonly static string ConnectionString = ConfigurationManager.ConnectionStrings[DefaultConnectionString].ConnectionString;
readonly static SqlConnectionStringBuilder MyBuilder = new SqlConnectionStringBuilder(ConnectionString);
public static void InstallServices(SqlFeatures sqlFeatures)
{
SqlServices.Install(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString);
}
public static void UninstallServices(SqlFeatures sqlFeatures)
{
SqlServices.Uninstall(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString);
}
}
}
感谢@ImarSpaanjaars http://imar.spaanjaars.com/563/using-entity-framework-code-first-and-aspnet-membership-together。