2016-03-03 73 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