MVC 实体框架映射正确,但表不正确
本文关键字:不正确 实体 框架 映射 MVC | 更新日期: 2023-09-27 18:37:26
我目前正在使用 MVC4 实体框架制作一个票务系统。
3类之间的关系用户到管理员 = 1:0...1 1 到 0 或 1 = 很少有用户具有管理员状态,但不是全部。
管理员到工单 = 1:*|1 到多 = 管理员可以分配多个票证,但一个票证只能分配给一个管理员
用户到工单 = 1:*|1 到多 = 用户可以打开多个工单,但一个工单只能有一个用户。
以下是我当前的表。
我的问题是为什么我的管理表显示不正确地看到这里
我希望每张票证都由 TicketID 标识,因此在 Admin 表上它应该有 AdminID(将解决问题的管理员)、UserID(提交工单的人)和 TicketID。
我遵循了一个教程,该教程显示了 1 到多个关系,其中团队 = 管理员(1) 到玩家 = 票证(许多)
球员.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
}
团队.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
}
我的代码。
用户.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; }
}
门票.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; }
}
管理员.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; }
}
配置.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();
}
}
}
一切
看起来都很好。 如果您有多对一的管理员票证,则有一些(许多)票证属于一个管理员,因此它们应该有一个 AdminID 列。并且管理表上没有此关系的列。这就是它的工作原理!