1

我在 Visual Studio 2012 中制作了一个 Internet MVC 4 应用程序,我想使用 SingleMembership 添加用户。起初我看到用户数据库并不是我想要的,它们在 SQL/Express 数据库上,我希望它们在我已经为我的应用程序中的所有模型创建的 SQL/Server 上。所以我所做的是修改 Visual Studio 2012 为我的数据库创建的连接字符串:

<add name="Test2_Entities" connectionString="metadata=res://*/Models.Model.csdl|res://*/Models.Model.ssdl|res://*/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=FERNANDO-PC\SQLSERVER;initial catalog=Test2;persist security info=True;user id=****;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

然后我意识到我需要 2 个连接字符串,因为元数据部分出现了一些错误,并且提供程序名称将其更改为“System.Data.SqlClient”,所以新的连接字符串确实是第一个,但有以下变化:

<add name="Test2_Entities2" connectionString="data source=FERNANDO-PC\SQLSERVER;initial catalog=Test2;persist security info=True;user id=****;password=****;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

为了在我的数据库中创建用户表,我还更改了Filters文件夹中InitializeSingleMemebershipAttribute.cs文件中的一行(准确地说是第 41 行):

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

至:

WebSecurity.InitializeDatabaseConnection("Test2_Entities2", "UserProfile", "UserId", "UserName", autoCreateTables: true);

以及位于Models文件夹中的AccountModels.cs中的其他行:

public UsersContext() : base("DefaultConnection")

至:

public UsersContext() : base("Test2_Entities")

控制成员资格、角色、OAuth 和这些东西的默认表是在我想要的数据库中创建的。(这是问题的背景,并认为有些人会觉得它有帮助)

问题是在我的 SQL 数据库中创建表时,有些列不在我在AccountModels.cs中定义的数据类型中,并且没有创建其他字段。更具体地说,在AccountModels.cs我有这个类:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string RandomString { get; set; }
}

在创建的表中,UserID得到一个 int,当我尝试更改时,我得到一个错误:

连接的数据库服务器不支持从“int”转换为“uniqueidentifier”。

而且,RandomString字符串不会出现在UserProfiles表中。

这个问题的答案: “我如何使用 SingleMembership 管理配置文件”stackoverflow 问题 真的很有帮助,但我不能像答案建议的那样更改字段和数据类型。

有什么我想念的吗?或者在做这些改变之前我应该​​设置什么?

4

2 回答 2

3

您不能更改 UserId 类型,因为它被用作同样在此数据库中生成的其他表的外键。如果您成功让它更改数据库中的此列,您将收到以下错误:

UserProfile.UserId' is not the same data type as referencing column 'webpages_UsersInRoles.UserId' in foreign key 'fk_UserId'

当我尝试这样做时,创建了一些表,并且您可以看到其他表使用 UserId 链接到 UserProfile 表。

在此处输入图像描述

但正如您从这个快照中看到的那样,我能够添加名为 RandomString 的自定义列。我对您无法更改 UserProfile 对象并将其反映在表中的评论感到困惑。我在这个网站上看到了很多关于这个问题的投诉,所以我试着修改一下,看看我是否可以重现这个问题。当我使用此示例时,我能够将 UserId 更改回 int 以便它可以工作,甚至可以添加另一个属性/列。正如您在此快照中看到的那样,它也有效。

在此处输入图像描述

但是后来我打开了一个具有自定义 UserProfile 的旧项目并尝试对其进行修改,但它不会反映数据库中的更改。它被我使用的最后一个模型(与 MVC 4 模板生成的模型不同的自定义模型)卡住了,即使我删除了数据库或修改了数据库名称也不会改变。此 MVC 4 模板使用 EF 5,我认为这与该版本中数据库迁移的处理方式以及 InitializeSimpleMembershipAttribute 创建数据库的非常规方式有关,如以下代码片段所示:

// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();

长话短说,我已经看到这些 MVC 4 项目进入这种状态,对 UserProfile 的更改将不起作用,我还没有找到解决问题的方法。如果我找到解决方案,我会更新这个答案。

于 2013-01-10T20:41:46.953 回答
1

只需从您的代码中删除 GUID 部分(让默认的 UserID 保持主键),它就会起作用。Kevin Junghans 解释了原因。

运行您的 MvcApplication 现在应该对表结构进行必要的更改。

如果没有:您必须进行迁移。 或者 您可以从数据库中删除 UserProfile (和其他网页_ * 表),然后运行应用程序

可能会帮助您完成迁移过程

于 2013-10-09T17:57:51.490 回答