簡體   English   中英

ASP.Net MVC 4 SimpleMembership“重新發送確認電子郵件”

[英]ASP.Net MVC 4 SimpleMembership “Re-Send Confirmation Email”

我為“自動生成的” webpages_Membership表創建了一個模型,以便在用戶丟失確認電子郵件以重新發送該郵件時可以讀取ConfirmationToken。 這是我在AccountModels.cs中的代碼:

[Table("webpages_Membership")]
public class webpages_Membership
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public Nullable<DateTime> CreateDate { get; set; }
    public string ConfirmationToken { get; set; }
    public Nullable<bool> IsConfirmed { get; set; }
    public Nullable<DateTime> LastPasswordFailureDate { get; set; }
    public int PasswordFailuresSinceLastSuccess { get; set; }
    public string Password { get; set; }
    public Nullable<DateTime> PasswordChangedDate { get; set; }
    public string PasswordSalt { get; set; }
    public string PasswordVerificationToken { get; set; }
    public Nullable<DateTime> PasswordVerificationTokenExpirationDate { get; set; }
}

public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<webpages_Membership> webpages_Membership { get; set; }
}

在創建此模型之前,我可以使用以下代碼行在App_Start上插入一個用戶:

if (Membership.Provider.GetUser("admin", false) == null)
        {
            ((SimpleMembershipProvider)Membership.Provider).CreateUserAndAccount("admin", "bidchuck");
        }

但是,在實現此模型之后,該行現在將引發異常:

[SqlException (0x80131904): Cannot insert explicit value for identity column in table 'webpages_Membership' when IDENTITY_INSERT is set to OFF.]

因此,我懷疑關於我的模型代碼要從該表中讀取數據的某些事情與WebSecurity自動生成該表的方式相沖突,這是導致異常的原因。 誰能解釋如何更改我的模型代碼,以便WebSecurity可以以自己的方式自動創建表?

另外,建議其他方式來實施“重新發送確認電子郵件”

謝謝!

問題在於:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

您是在明確地告訴EF這是一個標識列(即它應該為您生成一個ID)。 然而,用戶標識從ASP.NET成員的到來,所以你的表不應其實也可以生成一個ID。

注意:刪除該行后,您必須進行遷移。

更新

  1. 創建一個POCO來對表進行建模:

     [Table("webpages_Membership")] public class Membership { public Membership() { Roles = new List<Role>(); OAuthMemberships = new List<OAuthMembership>(); } [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int UserId { get; set; } public DateTime? CreateDate { get; set; } [StringLength(128)] public string ConfirmationToken { get; set; } public bool? IsConfirmed { get; set; } public DateTime? LastPasswordFailureDate { get; set; } public int PasswordFailuresSinceLastSuccess { get; set; } [Required, StringLength(128)] public string Password { get; set; } public DateTime? PasswordChangedDate { get; set; } [Required, StringLength(128)] public string PasswordSalt { get; set; } [StringLength(128)] public string PasswordVerificationToken { get; set; } public DateTime? PasswordVerificationTokenExpirationDate { get; set; } public ICollection<Role> Roles { get; set; } [ForeignKey("UserId")] public ICollection<OAuthMembership> OAuthMemberships { get; set; } } 

    基本上只對表中的字段建模。 這應該涵蓋所有內容,但是情況可能已經更改,或者可能添加了不同的約束。 [Table("webpages_Membership")]告訴EF,因為名稱或類別不完全匹配,因此要在哪個表中查找。

  2. 將POCO連接到DbContext子類。 您將要使用與實際映射實體所使用的上下文不同的上下文(用於遷移的上下文,用於更新數據庫的等等)。 數據庫初始化策略是在DbContext級別設置的,因此,如果將其添加到用於其他所有操作的同一策略中,它將嘗試進行遷移,最終會導致EF出現嚴重錯誤。

     public class SimpleMembershipContext : DbContext { public SimpleMembershipContext() : base("name=YourConnectStringName") { // this tells EF to not worry about migrating or modifying the database Database.SetInitializer<SimpleMembershipContext>(null); } public DbSet<Membership> Memberships { get; set; } } 

    將“ YourConnectionStringName”替換為項目數據庫的連接字符串的名稱(在web.config中)。 如果您也將成員身份存儲在其他位置,那么這也可能是一個完全不同的數據庫。

現在,您可以像其他實體一樣在代碼中使用它:

var membershipDb = new SimpleMembershipContext();
var someMember = membershipDb.Memberships.Find(userId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM