我有基于EF Code First的模型,我想将它们与默认的MembershipProvider一起使用,但我不知道如何正确编写模型,所以它不会删除我在那里重新创建表时的所有数据是对模型的改变。
答案 0 :(得分:9)
看看这个项目
http://codefirstmembership.codeplex.com/
它包含用户和角色的实体类,以及roleprovider和membershipprovider实现。如果在datacontext类中包含用户和角色,则表将在数据库中创建。
答案 1 :(得分:7)
您的问题分为两部分。
至于如何在模型更改时保留现有数据,就EF 4.0 / asp.net mvc 3而言,尚不支持数据库迁移。您将不得不转移到支持数据库迁移的asp.net mvc 4.0 / EF 4.3或使用类似的替代方案,但它仍然是beta版本。
asp.net mvc 4.0 database migration in scott gu's blog
现在谈谈如何首先使用带有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效率不高,因为在播种发生之前预期会员模式。我偶然发现了这篇很好的文章,其中有一些微调对我有用:
答案 2 :(得分:2)
目前(EF 4.1 CTP)EF Code First没有该选项。如果您对模型进行了更改,它总是会丢弃一个表。
<强>更新强>
EF 4.1 RTM允许您创建自定义数据库初始化程序并指定数据库对象和数据种子的创建。
答案 3 :(得分:1)
如果您使用的是SQL Server,请检查:
http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/
答案 4 :(得分:1)
我的库基本上允许您定义几乎所有内容的配置,包括:密钥类型,上下文对象所在的位置以及用户/角色实体所在的位置。可使用抽象基类或接口扩展。还可以使用存储库模式/工作单元/ IoC容器开箱即用。
答案 5 :(得分:0)
在我的DbContext.cs文件中,我有一个Seed函数,我调用ApplicationServices.InstallServices()
将ASP.NET成员资格安装到我的数据库。现在,每当我的初始化程序删除数据库时,它再次重新创建ASP.NET成员资格模式。
public class PanelInitializer : DropCreateDatabaseAlways<PanelContext>
{
protected override void Seed(PanelContext context)
{
//Install ASP.NET Membership
ApplicationServices.InstallServices(SqlFeatures.Membership | SqlFeatures.RoleManager);
new List<Panel>
{
ApplicationServices类
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。