简体   繁体   English

MVC实体框架映射正确,但表不正确

[英]MVC Entity Framework Mapping Correct but Tables incorrect

I'm currently making a ticketing system using MVC4 Entity Framework. 我目前正在使用MVC4实体框架制作票务系统。

Relations between 3 classes User to Admin = 1:0...1 1 to 0 or 1 = Few users will have admin status but not all. 3个类之间的关系用户与管理员= 1:0 ... 1 1至0或1 =很少有用户具有管理员身份,但不是全部。

Admin to Ticket = 1:*|1 to Many = Admins can be assigned with more than 1 ticket but one ticket can only be assigned to one admin 管理员到票证= 1:* | 1到很多=管理员可以分配多于1张票证,但一张票证只能分配给一位管理员

User to Ticket = 1:*|1 to Many = Users can open multiple tickets but one ticket can only have one user. 用户到票证= 1:* | 1到很多=用户可以打开多张票证,但一张票证只能有一个用户。

Here are what my current tables look like. 是我当前的表格。

My issue is why is my admin table displaying incorrectly see HERE 我的问题是为什么我的管理表显示不正确,请参见此处

I want each ticket to be identified by a TicketID so on the Admin table it should have the AdminID(Admin that's going to fix the issue),UserID(The person who submitted the ticket) and TicketID. 我希望每个票证都由TicketID标识,因此在Admin表上,它应该具有AdminID(将解决问题的Admin),UserID(提交票证的人)和TicketID。

I followed a tutorial that shows 1 to many relationships where Team = Admin(1) to Players = Tickets(Many) 我遵循的教程显示了一对多的关系,其中团队=管理员(1)与玩家=门票(许多)

Player.cs ( Tickets) Player.cs(门票)

public class Player
{
    public int PlayerId { get; set; }
    public string Name { get; set; }
    public int TeamId { get; set; }

    public virtual Team Team { get; set; } // This is new
}

Team.cs (Admin) Team.cs(管理员)

public class Team
{
    public int TeamId { get; set; }
    [Required] public string Name { get; set; }
    public string City { get; set; }
    public DateTime Founded { get; set; }

    public virtual ICollection<player> Players { get; set; } // This is new
}

My code. 我的代码。

User.cs User.cs

    public class User
    {
        [Key]
        public int UserID { 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; }

        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime EnrollmentDate { get; set; }

        public string FullName
        {
            get { return LastName + ", " + FirstMidName; }
        }
   //     public int AdminiID { get; set; }
        [ForeignKey("AdminID")]
        public virtual Administrator Administrator { get; set; }

        public string AdminRole { 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 int TicketID { get; set; }
        public virtual ICollection<Ticket> Tickets { get; set; }

    }

Ticket.cs Ticket.cs

public class Ticket
{
    public int TicketID { get; set; }
    public string Issue { 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 AdminID { get; set; }
    //[ForeignKey("AdminID")]
    //public Administrator Admin { get; set; }

    [ForeignKey("UserID")]
    public virtual User User { get; set; }
    public int UserID { get; set; }
}

Administor.cs 管理员

public class Administrator
{
    [ForeignKey("User")]
    public int UserID { get; set; }
    [Key]
    public int AdminID { get; set; }
    public int TicketID { get; set; }        
    [StringLength(50)]

    public virtual ICollection<Ticket> Tickets { get; set; }
    public virtual User User { get; set; }
}

Configuration.cs Configuration.cs

namespace RecreationServicesTicketingSystem.Migrations
{
    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>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(RecreationalServicesTicketingSystem.DAL.IssueContext context)
        {
            var departments = new List<Department>
            {
                new Department { DepartmentID = 1, Name = "IT"},
                new Department { DepartmentID = 2, Name = "Admin" },
                new Department { DepartmentID = 3, Name = "Human Resources"},
                new Department { DepartmentID = 4, Name = "Mechanics" },
                new Department { DepartmentID = 5, Name = "Directors" },
                new Department { DepartmentID = 6, Name = "Operations"}

            };
            departments.ForEach(s => context.Departments.AddOrUpdate(p => p.Name, s));
            context.SaveChanges();


            var depots = new List<Depot>
            {
                new Depot { DepotID = 1, Name = "Porana"},
                new Depot { DepotID = 2, Name = "Far North"},


            };
            depots.ForEach(s => context.Depots.AddOrUpdate(p => p.Name, s));
            context.SaveChanges();

            var users = new List<User>
        {
            new User { FirstMidName = "Jason",   LastName = "Wan",
                EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1, DepotID = 1,AdminRole="Administrator LVL1"},
            new User { FirstMidName = "Andy", LastName = "Domagas",
                EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1,DepotID = 1,AdminRole="Administrator LVL2"},
            new User { FirstMidName = "Denis",   LastName = "Djohar",
                EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1 ,DepotID = 1,AdminRole="Administrator LVL3"},
            new User { FirstMidName = "Christine",   LastName = "West",
                EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1, DepotID = 1},

        };


            users.ForEach(s => context.Users.AddOrUpdate(p => p.FirstMidName, s));
            context.SaveChanges();

            users.ForEach(s => context.Users.AddOrUpdate(p => p.LastName, s));
            context.SaveChanges();


            var administrator = new List<Administrator>
            {
                new Administrator {AdminID = 1,  User = users.Single ( s => s.UserID == 1),
                /*Tickets = new List<Ticket>()*/ },
                new Administrator {AdminID = 2, User = users.Single ( s => s.UserID == 2),
                /*Tickets = new List<Ticket>()*/ },
                new Administrator {AdminID = 3,  User = users.Single ( s => s.UserID == 3),
                /*Tickets = new List<Ticket>() */}

            };
            administrator.ForEach(s => context.Administrators.AddOrUpdate(p => p.AdminID, s));
            context.SaveChanges();

            var categories = new List<Category>
            {
                new Category {CategoryID = 0001, Title = "Desktop"},
                new Category {CategoryID = 0002, Title = "Mobile"},
                new Category {CategoryID = 0003, Title = "Menzits"},
                new Category {CategoryID = 0004, Title = "XMPRO"},
                new Category {CategoryID = 0005, Title = "Con-X"},
                new Category {CategoryID = 0006, Title = "Promapp"},
                new Category {CategoryID = 0007, Title = "QGIS"},
            };
            categories.ForEach(s => context.Categories.AddOrUpdate(p => p.Title, s));
            context.SaveChanges();

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


            foreach (Ticket e in tickets)
            {
                var ticketInDataBase = context.Tickets.Where(
                    s =>
                        s.User.UserID == e.UserID &&
                        s.Category.CategoryID == e.CategoryID).SingleOrDefault();
                if (ticketInDataBase == null)
                {
                    context.Tickets.Add(e);
                }
            }
            context.SaveChanges();
        }
    }
}

Everything look OK. 一切看起来都很好。 If you have many to one for admins to tickets there are some (many) tickets that belong to one admin so they should have an AdminID column. 如果您有多对一的票证管理员,则有一些(许多)票证属于一个管理员,因此它们应该有一个AdminID列。 And no column on the admin table for this relationship. 并且在管理表上没有此关系的列。 That's how it works! 这就是它的工作原理!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM