MVC 4 简单成员资格模型首先



在过去的几天里,我在Stack和其他编码网站上进行了研究,似乎找不到解决我的问题的方法。

我的目标是使用我自己的数据库配置简单成员资格。(是的,我已经进行了搜索,但没有一个回答我的问题(

我正在使用Visual Studio 2013和实体框架4

我为 asp.net mvc 4 使用了互联网应用程序模板,该模板已经内置了登录名。

我像网上的其他人一样做,似乎对某些人有用,但大多数时候他们根本没有答案。

当我运行代码并在 SimpleMembership Initializer 类中设置断点时。当我运行它并单击注册或登录时,我会逐步完成代码,当它下降到

WebSecurity.InitializeDatabaseConnection("AdventureWorksEntities", "mvcUser", "userID", "userName", autoCreateTables: false);

我收到此错误:">找不到名称为"mvcUser"的用户表。

我所知道的:

  • 我知道有一个名为"mvcUser"的表。
  • 我可以在网站中使用表中的表和属性进行 CRUD

如果您想要屏幕截图或更多代码,请告诉我。

这是类似于我正在看/谈论的内容,但我不明白所选答案中数字 2 和 3 是什么意思。

控制器

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{
private AdventureWorksEntities db = new AdventureWorksEntities();

这是最重要的^^

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.userName, model.UserPassword);
WebSecurity.Login(model.userName, model.UserPassword);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}

public class UsersContext : DbContext
{
public UsersContext()
: base("AdventureWorksEntities")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}

网络.config

<connectionStrings>    
<add name="AdventureWorksEntities" connectionString="metadata=res://*/Models.AdventureworksContext.csdl|res://*/Models.AdventureworksContext.ssdl|res://*/Models.AdventureworksContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=LEMN-476W-IT;initial catalog=AdventureWorks;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

筛选器\初始值设定项简单成员资格.cs

private class SimpleMembershipInitializer
{
public SimpleMembershipInitializer()
{
Database.SetInitializer<UsersContext>(null);
try
{
using (var context = new UsersContext())
{
if (!context.Database.Exists())
{
// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
}
}
WebSecurity.InitializeDatabaseConnection("AdventureWorksEntities", "mvcUser", "userID", "userName", autoCreateTables: false);
}
catch (Exception ex)
{
throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
}
}
}

"找不到名称为 XXXXX 的用户表">表示不能使用实体框架连接字符串(EntityClient提供程序(初始化SimpleMembershipProvider的数据库连接,必须使用纯SqlClient提供程序连接字符串对其进行初始化。

有 2 种解决方案可以解决此问题:

单个连接字符串(仅限 EDM(

使用EntityConnectionStringBuilder实例生成SqlClient提供程序连接字符串,然后指向InitializeDatabaseConnection以使用生成的连接字符串:

private class SimpleMembershipInitializer 
{
public SimpleMembershipInitializer() 
{
// initializer settings here
var connectionBuilder = new EntityConnectionStringBuilder("AdventureWorksEntities");
string sqlConnectionString = connectionBuilder.ConnectionString;
WebSecurity.InitializeDatabaseConnection(sqlConnectionString, "mvcUser", "userID", "userName", autoCreateTables: false);
}
}

双连接字符串

在web.config文件中connectionStrings部分添加一个新元素,其中包括SqlClient提供程序,使其看起来像这样(一个用于SQL Server,另一个用于EF(:

<connectionStrings>
<add name="AdventureWorksDatabase" connectionString="Data Source=LEMN-476W-IT;Initial Catalog=AdventureWorks;Integrated Security=True" providerName="System.Data.SqlClient" />
<add name="AdventureWorksEntities" connectionString="metadata=res://*/Models.AdventureworksContext.csdl|res://*/Models.AdventureworksContext.ssdl|res://*/Models.AdventureworksContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=LEMN-476W-IT;initial catalog=AdventureWorks;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

然后,将InitializeDatabaseConnection设置为使用新创建的连接字符串:

private class SimpleMembershipInitializer 
{
public SimpleMembershipInitializer() 
{
// initializer settings here
WebSecurity.InitializeDatabaseConnection("AdventureWorksDatabase", "mvcUser", "userID", "userName", autoCreateTables: false);
}
}

注意:这篇文章中接受的答案提到了如何使用SimpleMembershipProvider将代码优先转换为模型优先,但在这里您从一开始就设置了模型优先。

相关问题:

简单成员资格和实体框架是否可以共享连接字符串?

为简单成员资格设置有效的连接字符串

最新更新