C# MVC EF建立关系

C# MVC EF建立关系,c#,asp.net-mvc,entity-framework,relational-database,C#,Asp.net Mvc,Entity Framework,Relational Database,我正在尝试映射以下内容: 用户到管理员1到0..1的关系。一个用户可以是一种管理员状态或无管理员状态 用户可以打开多个票证,但一个票证只能分配给一个用户。用户到票证1到多 管理员(具有管理员状态的用户)拥有分配给他的要修复的票据。票证应具有adminID,以标识分配给它的管理员 有人能验证我的映射是否正确吗 我的票桌是什么样子的 modelBuilder.Entity() .HasMany(c=>c.Administrators)。WithMany(i=>i.ticket) .Map(t=>t.

我正在尝试映射以下内容:

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

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

管理员(具有管理员状态的用户)拥有分配给他的要修复的票据。票证应具有adminID,以标识分配给它的管理员

有人能验证我的映射是否正确吗

我的票桌是什么样子的

modelBuilder.Entity()
.HasMany(c=>c.Administrators)。WithMany(i=>i.ticket)
.Map(t=>t.MapLeftKey(“TicketID”)
.MapRightKey(“管理员ID”)
.ToTable(“管理员票”);
modelBuilder.Entity()
.HasKey(e=>e.UserID);
modelBuilder.Entity()
.has可选(s=>s.Administrator)//标记StudentAddress对于Student是可选的
.WithRequired(ad=>ad.User);//创建反向关系
配置.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();
}
公共配置()
{
AutomaticMiggerationsEnabled=假;
}
受保护的覆盖无效种子(RecreationalServicesTicketingSystem.DAL.IssueContext上下文)
{
var部门=新列表
{
新部门{DepartmentID=1,Name=“IT”},
新部门{DepartmentID=2,Name=“Admin”},
新部门{DepartmentID=3,Name=“人力资源”},
新部门{DepartmentID=4,Name=“Mechanics”},
新部门{DepartmentID=5,Name=“Directors”},
新部门{DepartmentID=6,Name=“Operations”}
};
departments.ForEach(s=>context.departments.AddOrUpdate(p=>p.Name,s));
SaveChanges();
var仓库=新列表
{
新仓库{DepotID=1,Name=“Porana”},
新仓库{DepotID=2,Name=“Far North”},
};
depots.ForEach(s=>context.depots.AddOrUpdate(p=>p.Name,s));
SaveChanges();
var users=新列表
{
新用户{FirstMidName=“Jason”,LastName=“Wan”,
EnrollmentDate=DateTime.Parse(“2016-02-18”),部门ID=1,DepotID=1},
新用户{FirstMidName=“Andy”,LastName=“Domagas”,
EnrollmentDate=DateTime.Parse(“2016-02-18”),部门ID=1,DepotID=1},
新用户{FirstMidName=“Denis”,LastName=“Djohar”,
EnrollmentDate=DateTime.Parse(“2016-02-18”),部门ID=1,DepotID=1},
新用户{FirstMidName=“Christine”,LastName=“West”,
EnrollmentDate=DateTime.Parse(“2016-02-18”),部门ID=1,DepotID=1},
};
users.ForEach(s=>context.users.AddOrUpdate(p=>p.FirstMidName,s));
SaveChanges();
users.ForEach(s=>context.users.AddOrUpdate(p=>p.LastName,s));
SaveChanges();
var管理员=新列表
{
新管理员{AdminID=1,AdminRole=“Administrator LVL1”,User=users.Single(s=>s.UserID==1),
票证=新列表()},
新管理员{AdminID=2,AdminRole=“Administrator LVL2”,User=users.Single(s=>s.UserID==2),
票证=新列表()},
新管理员{AdminID=3,AdminRole=“Administrator LVL3”,User=users.Single(s=>s.UserID==3),
票证=新列表()}
};
administrator.ForEach(s=>context.Administrators.AddOrUpdate(p=>p.AdminID,s));
SaveChanges();
变量类别=新列表
{
新类别{CategoryID=0001,Title=“Desktop”},
新类别{CategoryID=0002,Title=“Mobile”},
新类别{CategoryID=0003,Title=“Menzits”},
新类别{CategoryID=0004,Title=“XMPRO”},
新类别{CategoryID=0005,Title=“Con-X”},
新类别{CategoryID=0006,Title=“Promapp”},
新类别{CategoryID=0007,Title=“QGIS”},
};
categories.ForEach(s=>context.categories.AddOrUpdate(p=>p.Title,s));
SaveChanges();
var tickets=新列表
{
新票{
UserID=users.Single(s=>s.LastName==“Wan”).UserID,
类别ID=类别。单个(c=>c.标题==“Con-X”)。类别ID,
问题=(“测试错误-新测试”),
AdminID=1,
优先级=优先级。高
},
新票{
UserID=users.Single(s=>s.LastName==“Wan”).UserID,
CategoryID=类别。单个(c=>c.Title==“桌面”)。CategoryID,
问题=(“测试错误2”),
AdminID=2,
优先级=优先级.Med
},
};
foreach(票证中的票证e)
{
var ticketInDataBase=context.Tickets.Where(
s=>
s、 User.UserID==e.UserID&&
s、 Category.CategoryID==e.CategoryID).SingleOrDefault();
if(ticketInDataBase==null)
{
上下文。票证。添加(e);
}
}
SaveChanges();
}
票务中心

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; }
}
公共枚举优先级
{
低、中、高
}
公务舱票
{
公共字符串问题{get;set;}
[DisplayFormat(NullDisplayText=“无优先级”)]
公共优先级?优先级{get;set;}
public int CategoryID{get;set;}
[外国钥匙(“类别”)]
公共虚拟类别{get;set;}
public int TicketID{get;set;}
public int AdminID{get;set;}
公共虚拟ICollection管理员{get;set;}
public int UserID{get;set;}
//[外汇基金(“TICKTID”)]
公共虚拟用户用户{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; }

}
公共类用户
{
public int UserID{get;set;}
[StringLength(50,最小长度=1)]
公共字符串LastName{get;set;}
[StringLength(50,MinimumLength=1,ErrorMessage=“名字不能超过50个字符)。]
[列(“名字”)]
公共字符串FirstMidName{get;set;}
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:yyyy-MM-dd}”,ApplyFormatInEditMode=true)]
公共日期时间
 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; }

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


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

[Key, ForeignKey("User")]
public int UserID { get; set; }
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; }
}