2013-03-28 78 views
0

我爲「自動生成的」webpages_Membership表創建了一個模型,以便在用戶丟失確認電子郵件以便能夠重新發送時可以讀取ConfirmationToken 。這裏是我的代碼AccountModels.cs:我創造了這個模型ASP.Net MVC 4 SimpleMembership「重新發送確認電子郵件」

[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可以自己的方式自動創建表?

另外,建議等方式對我實施「重新發送確認電子郵件」

謝謝!

回答

0

的問題是:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 

你明確地告訴EF這是一個標識列(即,它應該產生一個id爲你)。但是,UserId來自ASP.NET成員資格,因此您的表應該而不是事實上正在生成一個ID。

注意:您必須在刪除該行後進行遷移。

UPDATE

  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的令人討厭的錯誤。

    與項目的數據庫(在web.config中)的連接字符串的名稱替換「YourConnectionStringName」。這也可能是一個完全不同的數據庫,如果你在其他地方存儲會員資料的話。現在

,與,你可以在你的代碼中使用它像任何其他實體:

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

感謝克里斯。聽起來你知道你在說什麼。我刪除了那一行,但得到了同樣的確切異常。我的repro步驟是刪除SQL Server對象資源管理器中的數據庫並按VS中的「play」。 – Infin8Loop

+0

或..如果您只是建議我如何從webpages_Membership表中獲取ConfirmationToken,以便我可以重新發送確認電子郵件,那將是非常好的! – Infin8Loop

+0

不知道爲什麼你會得到相同的例外。你也可以嘗試添加一行,但使用'DatabaseGeneratedOption.None'來強制你的意志在EF上。就使用webpages_Membership而言,只需創建一個POCO來爲表格建模,告訴它使用帶有[[Table(「webpages_Membership」)]]或Fluent API的表格,然後將其添加到未跟蹤的DbContext(添加'Database。 SetInitializer (null);'在DbContext子類的構造函數中)。然後,您可以像使用EF一樣正常使用它。 –