0

我目前有一个 ASP.NET MVC4 应用程序,我正在尝试为用户帐户设置 SimpleMembership。到目前为止,我已经使用 EF 代码优先迁移自动设置了一个数据库,并让它在我的数据库中生成 SimpleMembership 表。

我想设置它,以便在当前登录的用户和我创建的特定实体之间存在关系。我有两种不同类型的用户:学生和教师。这两个都派生自一个基本的“用户”类。

例如:当学生登录时,他/她将可以访问存储在与 EF 创建的“UserProfile”表不同的单独学生表中的帐户和其他数据等内容。

我已经对实现这一点进行了一些研究,我相信我需要使用“UserId”作为用户的外键属性创建一个链接。但是在那之后我需要采取哪些下一步才能真正能够将信息存储到不同的表中?

通过 UserId 键将 SimpleMembership 表和 Student 表中的数据绑定在一起的最佳方法是什么?

这是我的用户类,我认为这是建立两者之间关系的正确方法。

用户

    public class User
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name is required.")]
    [MaxLength(50)]
    public virtual string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name is required.")]
    [MaxLength(50)]
    public virtual string LastName { get; set; }
}

学生

    public class Student : User
{
    public virtual ICollection<Account> Accounts { get; set; }
}

老师

public class Teacher : User
{
    public virtual ICollection<Student> Students { get; set; }
    public virtual ICollection<Classroom> Classrooms { get; set; }
}
4

2 回答 2

1

您可以生成从 EntityTypeConfiguration 继承的配置类,其中 T 是您的模型类(在您的情况下为帐户、学生或课堂)。使用fluent API,您可以创建多对多关系,例如许多学生可能有许多帐户;Student_x_Account 的联结表可以表示 STUDENT_ID 与 ACCOUNT_ID 的关系。

于 2013-06-20T06:41:01.880 回答
1

由于在单个应用程序中将 SimpleMembershipProvider 集成到单个 DbContext 中时存在有关问题的评论,因此我将通过创建两个单独的项目来解决这个问题,方法是使用 EF 实现松散耦合的 ORM 方法,其中一个是初始化包含 4 个数据库的类库表加上 UserProfile 表和 App 项目本身。如果您在类库中遇到 SMP 问题,请改用 vs2012 创建一个空的 MVC4 Web 应用程序。

这最终会创建两个 DbContext,您必须在其中为您的 DAL(WebApi、Repo、IoC 等)使用一些架构模式,而这反过来又可以成为其自己的可重用类库。只需确保使用 UserId FK 在两个应用程序/项目中的数据模型之间提供参照完整性。

1.创建两个项目;类库和 Web 应用程序 MVC4

SMPIdentity 项目(类库)

  • dbo.UsersInRoles
  • dbo 角色
  • dbo.Memberships
  • dbo.OAuthMembership
  • dbo.UserProfile

应用项目(网络应用)

  • dbo.学生
  • dbo.教室
  • ETC...

2.SMPIdentity类库项目

您必须使用控制台管理器安装这些 nuget 包,SimpleMembershipProvider (4.0) 才能工作:

  • PM> Install-Package Microsoft.AspNet.WebPages.OAuth
  • PM> Install-Package EntityFramework -Version 5.0.0
  • PM> Install-Package Microsoft.AspNet.Mvc -Version 4.0.30506
  • PM> Install-Package WebMatrix.WebData

3.SMPIdentity 类库中的Enable-migrations

  • PM> Enable-Migrations

4.在SMPIdentity项目中添加.config文件:

     <connectionStrings>
        <add name="SMPConnection" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SMP;Integrated Security=True;MultipleActiveResultSets=False" />
      </connectionStrings>

<system.web>
     <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <clear />
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>

6.创建一个空的 DbContext 类 ( SMPEntities.cs) 来存储 SimpleMembershipProvider 表和 UserProfile 表,如果您希望向 UserProfile 模型添加其他属性。如果不只是留空

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace SMPIdentityMVC4
{
    public class SMPContext : DbContext
    {
        public SMPContext()
            : base("name=SMPConnection")
        {
        }
        //add DbSet<UserProfile> Users if you want custom properties   
        //dbo.UserProfile will only have int UserId & string UserName
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }

    }

    //Create if you want custom properties
    [Table("UserProfile")]
    public class UserProfile
    {
        //...ctors here
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address")]
        public string Email { get; set; }
        [ScaffoldColumn(false), Required]
        public string ImageUrl { get; set; }
        [DisplayFormat(DataFormatString = "{0}")] //{0:d} or {0:D}
        [DataType(DataType.DateTime), ScaffoldColumn(false)]
        public DateTime DateJoined { get; set; }
    }

}

6.在 SMPIdentity 类库中从 CF 迁移创建数据库:

  • PM> Add-migration SMPInitial

    7.Configuration.cs在 Migrations 文件夹中编辑并System.Web在需要时添加对 Project 的引用:

    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using System.Web.Security;
    using WebMatrix.WebData;
    
    internal sealed class Configuration : DbMigrationsConfiguration<SMPContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }
    
        protected override void Seed(DomainContext context)
        {
    
             WebSecurity.InitializeDatabaseConnection(
                "SMPConnection",
                "UserProfile",
                "UserId",
                "UserName", autoCreateTables: true);
    
             if (!WebSecurity.UserExists("yardpenalty"))
                WebSecurity.CreateUserAndAccount(
                "yardpenalty",
                "password",
                new
                {
                    Email = "yardpenalty@email.com",
                    ImageUrl = "/Content/Avatars/yardpenalty.jpg",
                    DateJoined = DateTime.Now,
                },
                false);
    
            if (!Roles.RoleExists("Administrator"))
                Roles.CreateRole("Administrator");
            if (!Roles.RoleExists("Blogger"))
                Roles.CreateRole("Blogger");
    }
    

8. 初始化和填充 SMP 数据库中的表

  • PM> Update-database

9. 创建实际 Web 应用程序并执行以下操作:

  • 将参考或整个 SMPIdentity 项目添加到实际的 MVC4 Web 应用程序

  • 为 SMP 添加 connectionString,因此有两个 connectionString;SMPConnection & DefaultConnection

  • 为 DbContext 选择架构模式,一切就绪!您可以在 SMP 项目完好无损的情况下在 Web 应用程序上使用代码优先迁移

控制器中的简化示例代码(依赖注入?):

  public class studentController : Controller
    {
        private readonly SimpleMembershipRepository _accounts = null;
        private readonly StudentRepository _students = null;
        public StudentController(IRepository students, IRepository account)
        {
            _accounts = accounts;
            _students = students;
        }
    }

现在您有一个帐户数据库,如果您愿意,它包括整个域的 SimpleMembershipProvider!创建一个 WebApi 控制器来访问 Simple Membership Provider 数据库以便于访问。

于 2015-02-22T19:12:16.797 回答