0

...至少我认为这就是正在发生的事情。

我试图在我的 MVC 网站中使用 UserProfile 表来保存不仅仅是用户 ID 和用户名。

对不起,我是一个糟糕的菜鸟,我知道这是对示例代码的拙劣破解,但这是我在 AccountController 中得到的:

    Public Function Register(ByVal model As RegisterModel) As ActionResult

        If ModelState.IsValid Then
        Using db As New UsersContext()
            ' Attempt to register the user
            Try
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password)
                WebSecurity.Login(model.UserName, model.Password)

                Dim id As Integer = WebSecurity.GetUserId(User.Identity.Name)

                Dim userProfile As UserProfile = db.UserProfile.Find(id)
                If IsNothing(UserProfile) Then
                    Return HttpNotFound()
                End If


                db.Entry(UserProfile).State = EntityState.Modified
                db.SaveChanges()

                Return RedirectToAction("Index", "Home")
            Catch e As MembershipCreateUserException

                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode))
            End Try
        End Using
    End If

它似乎正在工作,只是它附加了 dbo。在表名称而不是哈利法克斯前面。我已经在我的架构中了。我如何告诉它在那里使用什么?如果我放入一个dbo。表,代码运行,但将配置文件信息放在错误的位置。

4

1 回答 1

1

我可以在这里推断出两个问题

1.如何更改默认模式 (dbo) 以便在新模式名称 (halifax) 下创建表?

答:您似乎正在使用 SimpleMembershipProvider (SMP),并且在内部使用

WebSecurity.InitializeDatabaseConnection

使用分配给您的数据库用户的默认模式“dbo”来创建\访问 SimpleMembershipProvider 的表。

因此,您将需要进行一些更改以让 SMP 知道它应该在特定模式中创建表。

我没有找到使用 SMP 的直接方法来告诉它在特定模式中创建 UserProfile 表。

我如何实现这一点是通过创建我自己的 SMP 类,如下所示:

[Table("UserProfile", Schema = "Halifax")]
public class UserProfile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string UserName { get; set; }

    [MaxLength(100)]
    [EmailAddress]
    public string EmailId { get; set; }
}

请注意添加到表属性的架构名称。

您可以找到有关如何将简单成员表添加为您的实体框架的一部分的完整说明。

2.从这个问题的主题,我可以推断您想在默认表中添加更多列,例如 UserProfile。

答:如上所述,为了在 SMP 表中包含附加信息,您必须创建自己的等效类并在类中添加额外的列。请注意,我已将 EmailId 添加到上面的 UserProfile 表中。如果您阅读本文(尽管它打算涵盖 SMP 的不同方面),您将找到添加自定义字段的说明。希望这可以帮助。

更新:

这就是我在VB中实现这一点的方式(经过数十次尝试:))

<Table("UserProfile", Schema:="Halifax")>
Public Class UserProfile
    <Key>
    <DatabaseGenerated(DatabaseGeneratedOption.Identity)>
    Public Property UserId() As Integer

    Public Property UserName() As String

    <MaxLength(100)>
    Public Property EmailId() As String
End Class
于 2013-08-22T05:47:08.157 回答