【问题标题】:How to properly inherited ASP.net MembershipUser with DB table persistence如何正确继承具有 DB 表持久性的 ASP.net MembershipUser
【发布时间】:2014-04-06 05:37:46
【问题描述】:

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

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

  1. 身份证
  2. 测试
  3. 电子邮件
  4. 评论
  5. 已批准
  6. 上次登录日期
  7. 上次活动日期

发生了什么?如何更正此问题以包含其余属性?

会员等级如下所示:

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

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

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

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

我一定是在左外野旅行。如果这些值无法更新和存储,它们有什么用。总而言之,它们不在表中,我无法将它们放在那里,我无法更新它们,并且如果不走一些我确定不是初衷的旁路,我就无法存储它们。

谁能指出我正确的方向。

【问题讨论】:

  • 我不确定我是否遵循。据我所知,您已扩展 MembershipUser 以包含两个附加字段:“Id”和“test”。你是说这两个字段不是底层数据库表的一部分?
  • 没有。那些出现在数据库中。请参阅包含确实出现的字段的编号列表(上图)。 MembershipUser 中还有其他字段没有出现。我不明白是什么阻止了继承的字段出现。而且我不明白如何让它们出现。

标签: c# asp.net-mvc


【解决方案1】:

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

这就像重新实现整个类。恕我直言,这使得 MembershipUser 类更像一个接口,而不是实际上除了表示值之外什么都不做。再说一次,恕我直言,我认为 MS 在 MVC 和 asp.net 的不同领域有点丢球。只有用户名和密码的简单基本用户基类在哪里。设计中极力宣扬的层次结构和可重用性在哪里?也许是因为我对 MVC 和 asp.net 还很陌生。也许我只是被其他语言和库宠坏了。

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

【讨论】:

  • 如何获取值以在构造函数中设置属性值?您是否从数据库中单独检索Aspnet_Membership 记录?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2018-07-25
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多