【问题标题】:MVC5 Referencing ApplicationDbContext : IdentityDbContext<ApplicationUser>MVC5 引用 ApplicationDbContext : IdentityDbContext<ApplicationUser>
【发布时间】:2016-07-15 05:18:15
【问题描述】:

我正在编写一个带有 EF 应用程序的 MVC4,现在正在将它升级到带有 EF 的 MVC5。在 MVC4 中,我遵循了一个创建 DBContext 的教程,如下所示(IssueContext.cs)。我知道在带有 Identity 的 MVC5 中,我们的 DBContext 必须从 IdentityDbContext 派生。在我的 Seed 方法中引用 IdentityDbContext 时遇到问题。

using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using RecreationalServicesTicketingSystem.Models;
using System.Collections.Generic;

internal sealed class Configuration : DbMigrationsConfiguration<RecreationalServicesTicketingSystem.DAL.IssueContext> <-- References the old one
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(RecreationalServicesTicketingSystem.DAL.IssueContext context)<--References the old one
    {



 //Errors on users (new users { FirstMidName.....})
        var users = new List<ApplicationUser>
    {
        new users { FirstMidName = "Jason",   LastName = "Wan",
            EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1, DepotID = 1,IsAdministrator = true},
        new users { FirstMidName = "Andy", LastName = "Domagas",
            EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1,DepotID = 1,IsAdministrator = true},
        new users { FirstMidName = "Denis",   LastName = "Djohar",
            EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1 ,DepotID = 1,IsAdministrator = true },
        new users { FirstMidName = "Christine",   LastName = "West",
            EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 2, DepotID = 3,IsAdministrator = false},

    };

 //Errors on UserID (... = users.Single(s => s.LastName == "Wan").UserID <--HERE)
        var tickets = new List<Ticket>
        {
            new Ticket {
                UserID = users.Single(s => s.LastName == "Wan").UserID,
                CategoryID = categories.Single(c => c.CategoryName == "Con-X" ).CategoryID,
                Issue = ("Con-X Login Error"),
                Priority = Priority.High
            },
            new Ticket {
                UserID = users.Single(s => s.LastName == "Wan").UserID,
                CategoryID = categories.Single(c => c.CategoryName == "Desktop" ).CategoryID,
                Issue = ("Can't remote access C0123"),
                Priority = Priority.Med
            },
        };

命名空间中不存在类型或命名空间名称“DAL” “RecreationalServicesTicketingSystem”(您是否缺少程序集 参考?)

DAL\IssueContext.cs(来自 MVC4 的旧数据类上下文)

namespace RecreationalServicesTicketingSystem.DAL
{
    public class IssueContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Ticket> Tickets { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Department> Departments { get; set; }
        public DbSet<Depot> Depots { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        }
    }
}

Models\IdentityModels.cs(带有标识的新类 MVC5

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System;
using System.Collections.Generic;

namespace RecreationalServicesTicketingSystem.Models
    {
        public class ApplicationUser : IdentityUser
        {
            public async Task<ClaimsIdentity> 
                GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
            {
                var userIdentity = await manager
                    .CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
                return userIdentity;
            }

            public bool IsAdministrator { get; set; }
            [StringLength(50, MinimumLength = 1)]

            public string LastName { get; set; }
            [StringLength(50, MinimumLength = 1, ErrorMessage = "First name cannot be longer than 50 characters.")]

            [Column("FirstName")]
            public string FirstMidName { get; set; }

            public string FullName
            {
                get { return FirstMidName + " " + LastName; }
            }
            [DataType(DataType.Date)]
            [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
            public DateTime EnrollmentDate { get; set; }
            public int DepartmentID { get; set; }
            [ForeignKey("DepartmentID")]
            public virtual Department Department { get; set; }
            public int DepotID { get; set; }
            [ForeignKey("DepotID")]
            public virtual Depot Depot { get; set; }
            public virtual ICollection<Ticket> Tickets { get; set; }
        }


        public class ApplicationRole : IdentityRole
        {
            public ApplicationRole() : base() { }
            public ApplicationRole(string name) : base(name) { }
            public string Description { get; set; }

        }


        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext()
                : base("DefaultConnection", throwIfV1Schema: false)
            {
            }


            public DbSet<Ticket> Tickets { get; set; }
            public DbSet<Category> Categories { get; set; }
            public DbSet<Department> Departments { get; set; }
            public DbSet<Depot> Depots { get; set; }

            static ApplicationDbContext()
            {
                Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
            }

            public static ApplicationDbContext Create()
            {
                return new ApplicationDbContext();
            }
        }
    }

【问题讨论】:

  • 使用 RecreationalServicesTicketingSystem 添加:?

标签: c# asp.net-mvc entity-framework asp.net-identity


【解决方案1】:

您仍在引用旧的namespace 和类。您需要将其更改为新的上下文。既然您已经包含了 using RecreationalServicesTicketingSystem.Models,那么您需要做的就是删除旧的引用命名空间。

using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using RecreationalServicesTicketingSystem.Models; // this is the namespace that has the new context
using System.Collections.Generic;

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext> //References the new one now
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(ApplicationDbContext context)//References the new one now
    {...}
    //...other code removed for prebity
}

【讨论】:

  • 应用您的解决方案后,我得到了 2 个新错误'ApplicationUser' does not contain a definition for 'UserID' and no extension method 'UserID' accepting a first argument of type 'ApplcationUser' could be found (and you missing a using directive or an assembly reference?) 您可以看到我的种子方法中标记的错误。我认为身份用户有它自己的用户 ID?是不是因为 Identity 使用 String 而不是 int?
  • 不是不是因为字符串。身份有一个 Id 而不是 UserId`。请记住,您正在从以前的版本进行更改,因此会有差异。在大多数情况下,这些错误是不言自明的。浏览它们并进行必要的更改。
  • 但是由于将其更改为 UserID = users.Single(s =&gt; s.LastName == "Wan").UserID,UserID = users.Single(s =&gt; s.LastName == "Wan").Id 因为 IdentityModel 的默认类型是字符串,这是否意味着我必须关注此站点:johnatten.com/2014/07/13/… 或者我可以转换它吗? toString()?
  • 这是可能的,但需要您根据 Identity 的默认值进行自定义。
  • 查看了网站,似乎您可以尝试遵循他们的做法。这样你就可以将 id 保持为你想要的 int。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多