如何为联结表创建新记录

时间:2014-10-19 20:28:48

标签: c# angularjs asp.net-mvc-5 entity-framework-6 asp.net-web-api2

我需要发布一个连接表Entity Framework生成(CustomerEmployeeJobs)。每个工作都可以有多个客户员工。每个Job必须有CustomerEmployee PM,CustomerEmployee Account,CustomerEmployee Admin和CustomerEmployee Superintendent。现在,这些是使用CustomerEmployeeRole属性定义的。当我创建一个新的工作时,我选择了显示具有适当标题的客户员工的方框。那我怎么做这个POST?我认为这种关系会是多对多的。 Junction表有一个JobId和CustomerEmployeeId列。所以看起来这是正确的。我可以手动添加具有多个CustomerEmployeeId的相同JobId。但是我如何通过实际应用程序做到这一点?这是New Job Modal的样子。如果我改变了存储CustomerEmployee标题的方式会更好吗?而不是“字符串”CustomerEmployeeRole它可能是布尔,“bool”CustomerEmployeeIsPM,CustomerEmployeeIsAdmin等.... plunker

public class Job
{
    //job
    public int JobId { get; set; }
    public int? JobNumber { get; set; }
    public string JobName { get; set; }

    public virtual ICollection<CustomerEmployee> CustomerEmployees { get; set; }
}
public class CustomerEmployee
{
    [Key]
    public int CustomerEmployeeId { get; set; }
    public string CustomerEmployeeFirstName { get; set; }
    public string CustomerEmployeeLastName { get; set; }
    public string CustomerEmployeeRole { get; set; }


    public virtual ICollection<Job> Jobs { get; set; }
}

// POST api/<controller>
    public async Task<IHttpActionResult> PostnewJob([FromBody]JobViewModel newJob)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        using (var context = new ApplicationDbContext())
        {
            var job = new Job();

            Mapper.CreateMap<JobViewModel, Job>();
            Mapper.Map(newJob, job);

            context.Jobs.Add(job);

            await context.SaveChangesAsync();

            return CreatedAtRoute("JobApi", new { job.JobId }, job);
        }
    }

1 个答案:

答案 0 :(得分:2)

我认为你的模型不正确。你说的是:

  • 您的工作只有1个客户PM和1个CustomerSuperintendent
  • 您的CustomerPM可以拥有多个职位以及您的CustomerSuperintendent

因此,您在CustomerEmployee表和Job表之间不需要联结表。您的Job表应该只有2个CustomerEmployee表的外键

我想你的模型看起来像这样:

public class Job
{
    //job
    public int JobId { get; set; }
    public int? JobNumber { get; set; }
    public string JobName { get; set; }

    [ForeignKey("CustomerPMId")] 
    public CustomerEmployee CustomerPM { get; set; }
    [ForeignKey("CustomerSuperintendentId")]        
    public CustomerEmployee CustomerSuperintendent { get; set; }
}

虽然它不是你的问题的一部分,因此也是offtopic,但我想提一下:在你使用它的方向上非常小心自动化器!其他方面是完美的,但从你的DTO到ef模型,IMO不要这样做!您的MVC模型很可能会根据您视图中的不同需求而改变,然后您需要配置automapper来纠正哪个可能不值得麻烦,如果您保持您的实体好看又小,就像您拥有的那样。