【问题标题】:MVC4 to MVC5 ICollection in MVC5?MVC5 中的 MVC4 到 MVC5 ICollection?
【发布时间】:2016-03-27 02:59:35
【问题描述】:

以前我在编写 MVC4 应用程序,这些是我的类:Ticket、Category、Department、Depot 和 User(现在是 IdentityModels.cs 中的身份用户)

类之间的关系如下:

一对多用户到票(一个用户可以打开很多票)

一对多类别到工单(一张工单可以有一个类别)

部门到用户一对一(一个用户只能有一个部门)

一对一 Depot 到用户(一个用户只能拥有一个 Depot)

我的问题是因为我已经从 MVC4 升级到 MVC5,MVC5 用户必须从 IdentityUser 派生,所以我必须删除我的 User.cs 并将代码放入我的 ApplicationUser : IdentityUser 类(如下所示)

这样做之后,我的 public virtual ICollection<User> Users { get; set; }public virtual User User { get; set; } 类将出现错误,因为它们没有引用任何东西(因为我已经删除了我的 User 类)。

找不到类型或命名空间名称“用户”(您是否缺少 using 指令或程序集引用?)

我需要将该代码更改为什么,以便它引用我的ApplicationUser : IdentityUser 类?

IdentityModels.cs(包括派生自 Identity User 的新用户类)

   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();
    }
}

仓库.cs

public class Depot
{
    public int DepotID { get; set; }
    [StringLength(50, MinimumLength = 1)]
    public string DepotName { get; set; }
    public virtual ICollection<User> Users { get; set; } <--Error
}

Department.cs

public class Department
{

    public int DepartmentID { get; set; }

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

    public virtual ICollection<User> Users { get; set; } <--Error
}

Ticket.cs

public class Ticket
{
    public int? TicketID { get; set; }
    [Required(ErrorMessage = "Please enter the description")]
    public string Issue { get; set; }
    [Display(Name = "Administrator")]
    [Required(ErrorMessage = "Please select the Administrator")]
    public int IssuedTo { get; set; }
    public int Author { get; set; }

    [DisplayFormat(NullDisplayText = "No Priority")]
    public Priority Priority { get; set; }
    [ForeignKey("CategoryID")]
    public virtual Category Category { get; set; }
    public int CategoryID { get; set; }
    public int UserID { get; set; }
    [ForeignKey("UserID")]
    public virtual User User { get; set; } <--Error
}

解决方案中未包含旧的 user.cs 文件

public class User
{
    public int UserID { get; set; }

    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; }


}

Configuration.cs的开始(种子方法)

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

    protected override void Seed(RecreationalServicesTicketingSystem.DAL.IssueContext context)
    {

【问题讨论】:

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


    【解决方案1】:

    您基本上是在重新创建实体之间的关系/导航。

    仓库.cs

    public class Depot {
        //....code removed for brevity
        public virtual ICollection<ApplicationUser> Users { get; set; } // fixed
    }
    

    Department.cs

    public class Department {
        //....code removed for brevity
        public virtual ICollection<ApplicationUser> Users { get; set; } // fixed
    }
    

    Ticket.cs

    public class Ticket {
        //....code removed for brevity
        public string UserID { get; set; } // fixed
        [ForeignKey("UserID")]
        public virtual ApplicationUser User { get; set; } // fixed
    }
    

    【讨论】:

    • 我不太明白你的意思。那么 ApplicationUser : Identity user 和来自 MVC4 的 User 是一样的吗?除了一个来自身份用户而另一个不是?
    • 为什么是public string UserID 而不是public int UserID 如果你看看我的Configuration.cs(种子方法)。它曾经使用 IssueContext(Data class context) 但现在它需要使用 ApplicationContext(Identity.cs) 既然 ApplicationContext 应该从 Identity Framework 派生,那会是什么? internal sealed class Configuration : DbMigrationsConfiguration&lt;RecreationalServicesTicketingSystem.Models.IdentitiModels.ApplicationDbContext&gt;??
    • IdentityUser.Id的默认类型是String
    • 诱饵和开关不受欢迎。您问的问题与您最初想知道的完全不同。
    • 我不明白你关于 dbcontext 的问题
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多