如何使用DB表持久性正确继承ASP.net MembershipUser

时间:2014-04-02 23:17:03

标签: c# asp.net-mvc

我正在使用自定义会员提供商。我还使用了继承和扩展MembershipUser的成员资格类。

我的问题来自创建用户并保存到数据库。当我观察数据库时,我只能找到具有正确数据的以下列。其余属性未列在列中。

  1. ID
  2. 测试
  3. 电子邮件
  4. 注释
  5. IsApproved
  6. LastLoginDate
  7. LastActivityDate
  8. 发生了什么以及如何更正此问题以包含其余属性?

    会员类看起来像这样:

    public class MyMembershipUser : MembershipUser
    { public MyMembershipUser(string providerName,
                string name,
                Object providerUserKey,
                string email,
                string passwordQuestion,
                string comment,
                bool isApproved,
                bool isLockedOut,
                DateTime creationDate,
                DateTime lastLoginDate,
                DateTime lastActivityDate,
                DateTime lastPasswordChangedDate,
                DateTime lastLockoutDate) :
            base(providerName, name, providerUserKey, email,
                    passwordQuestion, comment,
                    isApproved, isLockedOut,
                    creationDate, lastLoginDate,
                    lastActivityDate, lastPasswordChangedDate,
                    lastLockoutDate)
        {
        }
    
        [Key]
        public int Id { get; set; }
    
        public string test { get; set; }
    }
    
    :
    

    我的创作如下:

    MyMembershipUser usr = new MyMembershipUser(.......);
    dbcontext.users.Add(usr);
    dbcontext.SaveChanges();
    

    被修改............

    进一步的研究使我对MembershipUser的定义与我所看到的功能之间的关系有以下理解。

    email                   -   virtual get; set    -  Stored in DB
    comment                 -   virtual get; set    -  Stored in DB
    isApproved              -   virtual get; set    -  Stored in DB
    lastLoginDate           -   virtual get; set    -  Stored in DB
    lastActivityDate        -   virtual get; set    -  Stored in DB
    Username                -   virtual get         -  Not Stored
    providerName            -   virtual get         -  Not Stored 
    providerUserKey         -   virtual get         -  Not Stored
    passwordQuestion        -   virtual get         -  Not Stored
    isLockedOut             -   virtual get         -  Not Stored
    creationDate            -   virtual get         -  Not Stored
    lastPasswordChangedDate -   virtual get         -  Not Stored
    lastLockoutDate         -   virtual get         -  Not Stored
    

    在构造函数之后,所有值都被初始化并且可用,因此基类中有一些存储空间;但是,由于其中一些不在数据库表中,因此以后的检索不适用于这些属性。由此,我确定我必须实现自己的持久性。如何在MyMembershipUser模型中执行此操作而不与基类属性冲突?

    为了进行快速测试,我尝试了以下方法但没有成功。 base.PasswordQuestion是只读的。

    public virtual string PasswordQuestion {
        get {
            return base.PasswordQuestion;
        }
        set {
            base.PasswordQuestion = value;
        }
    }
    

    我必须在左边的地方旅行。如果这些值无法更新和存储,它们有什么用处。总而言之,他们不在桌面上,我无法将它们送到那里,我无法更新它们,而且我无法存储它们而无需走一条我确定的路线不是最初的意图。

    有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

我终于想出了如何让它发挥作用。我必须覆盖未存储在DB中的get / read-only属性的get / set。然后,在构造函数中,将这些属性设置为传入值。

这就像重新实现整个班级一样。恕我直言,这使得MembershipUser类很像一个接口而不是实际上做任何事情但代表值。再次,恕我直言,我认为MS有点放弃了MVC和asp.net的不同领域。简单和基本的用户基类只有用户名和密码在哪里。设计的层次结构和可重用性在哪里如此艰难。也许是因为我还是MVC和asp.net的新手。也许我只是被其他语言和图书馆所破坏。

在任何一种情况下,我都找到了一个可行的解决方案。基本上继承MembershipUser。覆盖需要保留在DB中的get属性。添加这些属性的集。存储的那些(使用base get / set)是好的。现在我有一个可以向下转换为MembershipUser类型的类。