[英]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。
注意:刪除該行后,您必須進行遷移。
更新
創建一個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,因為名稱或類別不完全匹配,因此要在哪個表中查找。
將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.