2016-03-03 71 views
0

我在尝试映射以下内容:MVC EF建立关系

用户到管理员1到0..1的关系。一个用户可以是一种管理状态或不管理状态

用户可以打开多个工单,但工单只能分配给一个用户。用户到票1到很多

管理员(具有管理员状态的用户)已分配给他修理的票据。该票据应具有adminID以标识分配给哪个管理员。

有人可以验证我的映射是正确

什么我的票表看起来像CLICK HERE

modelBuilder.Entity<Ticket>() 
    .HasMany(c => c.Administrators).WithMany(i => i.Tickets) 
    .Map(t => t.MapLeftKey("TicketID") 
     .MapRightKey("AdministratorID") 
     .ToTable("AdministratorsTickets")); 


modelBuilder.Entity<Administrator>() 
      .HasKey(e => e.UserID); 

modelBuilder.Entity<User>() 
    .HasOptional(s => s.Administrator) // Mark StudentAddress is optional for Student 
    .WithRequired(ad => ad.User); // Create inverse relationship 

Configuration.cs

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}, 
    new User { FirstMidName = "Andy", LastName = "Domagas", 
     EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1,DepotID = 1}, 
    new User { FirstMidName = "Denis", LastName = "Djohar", 
     EnrollmentDate = DateTime.Parse("2016-02-18"), DepartmentID = 1 ,DepotID = 1}, 
    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, AdminRole = "Administrator LVL1", User = users.Single (s => s.UserID == 1), 
     Tickets = new List<Ticket>() }, 
     new Administrator {AdminID = 2, AdminRole = "Administrator LVL2", User = users.Single (s => s.UserID == 2), 
     Tickets = new List<Ticket>() }, 
     new Administrator {AdminID = 3, AdminRole = "Administrator LVL3", 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 = ("Test Error NEW TEST"), 
      AdminID = 1, 
      Priority = Priority.High 
     }, 
     new Ticket { 
      UserID = users.Single(s => s.LastName == "Wan").UserID, 
      CategoryID = categories.Single(c => c.Title == "Desktop").CategoryID, 
      Issue = ("Test Error 2"), 
      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(); 
} 

Ticket.cs

public enum Priority 
{ 
    Low, Med, High 
} 

public class Ticket 
{ 
    public string Issue { get; set; } 
    [DisplayFormat(NullDisplayText = "No Priority")] 
    public Priority? Priority { get; set; } 
    public int CategoryID { get; set; } 
    [ForeignKey("CategoryID")] 
    public virtual Category Category { get; set; } 
    public int TicketID { get; set; } 
    public int AdminID { get; set; } 
    public virtual ICollection<Administrator> Administrators { get; set; } 
    public int UserID { get; set; } 
    //[ForeignKey("TicketID")] 
    public virtual User User { get; set; } 
} 

个User.cs

public class User 
{ 

    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 AdministratorID { get; set; } 
    [ForeignKey("AdministratorID")] 
    public virtual Administrator Administrator { 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; } 

} 

Administrator.cs

public class Administrator 
{ 
    [Key, ForeignKey("User")] 
    public int UserID { get; set; } 
    public int AdminID { get; set; } 
    public int TicketID { get; set; }   
    [StringLength(50)] 
    public string AdminRole { get; set; } 
    public virtual ICollection<Ticket> Tickets { get; set; } 
    public virtual User User { get; set; } 
} 

IssueContext.cs

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<Administrator> Administrators { get; set; } 
     public DbSet<Depot> Depots { get; set; } 


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

      modelBuilder.Entity<Ticket>() 
       .HasMany(c => c.Administrators).WithMany(i => i.Tickets) 
       .Map(t => t.MapLeftKey("TicketID") 
        .MapRightKey("AdministratorID") 
        .ToTable("AdministratorsTickets")); 


      modelBuilder.Entity<Administrator>() 
         .HasKey(e => e.UserID); 

      modelBuilder.Entity<User>() 
       .HasOptional(s => s.Administrator) // Mark StudentAddress is optional for Student 
       .WithRequired(ad => ad.User); // Create inverse relationship 


     } 
    } 

回答

0

映射不是100%正确的,这些部件看起来我错了:

modelBuilder.Entity<Administrator>() 
      .HasKey(e => e.UserID); 

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

从这些行看起来l像你一样使用Administrator.UserID这样的主键和外键。

相反,你应该让你的Administrator.AdministratorId一个主键:

modelBuilder.Entity<Administrator>() 
      .HasKey(e => e.AdministratorID); 

public class Administrator 
{ 
    [Key] 
    public int AdminID { get; set; } 
    [ForeignKey("User")] 
    public int UserID { get; set; } 
    public int TicketID { get; set; }   
    [StringLength(50)] 
    public string AdminRole { get; set; } 
    public virtual ICollection<Ticket> Tickets { get; set; } 
    public virtual User User { get; set; } 
} 

而且我不是100%确认您拥有管理员和票证之间的正确映射:你有1从管理员一对多的关系/用户到Tickets,但您仍然在Administrator和User类中有外键TicketID,这也是不正确的。

+0

我在Ticket的类中有外键,因为我想用所有ID显示数据。当我重新编辑问题中的代码时,请给我2分钟,然后我会通过上传图像向您展示我的票证表。出于某种原因,一切正在工作,我是如何喜欢它...... – TykiMikk

+0

您的管理员有票的集合,所以票通过FK'Ticket.AdministratorID'引用管理员。另一方面,由于管理员处于1对多关系的“1”端,因此无法通过'Administrator.TicketID'访问1张票。这部分看起来不对。 –

+0

我提出了一个新的问题,并详细阐述了它在这里检查:http://stackoverflow.com/questions/35795608/mvc-code-first-entity-frameworkno-errors-but-tables-arent-populated-correctly – TykiMikk