0

我有两个实体类定义为

1) 项目类

public class Project
{
     [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ProjectId { get; set; }  
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime CreatedDate { get; set; }
    public ICollection<Person> Persons { get; set; }
}

2)人员类

    public class Person
    {
        public Person()
        {
            Projects = new List<Project>();
        }


        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int PersonId { get; set; }
        public string Name { get; set; }
        public string EmailAddress { get; set; }
        public string Designation { get; set; }
        public string CellPhone { get; set; }
        public ICollection<Project> Projects { get; set; }
    }

在我的 DataContext 类中,配置定义为

  public class DataContext: DbContext
    {
        public DataContext()
            : base("name=DataContext")
        {
        }

        public DbSet<Project> Projects { get; set; }

        public DbSet<Person> Persons { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Project>()
               .HasMany<Person>(p => p.Persons)
               .WithMany(p => p.Projects)
               .Map(m =>
               {
                   m.ToTable("ProjectPersons");
                   m.MapLeftKey("ProjectId");
                   m.MapRightKey("PersonId");
               });


        }

    }

创建新项目后,项目表和人员表填充了它的记录,但我注意到通过加入创建的 ProjectPerson 表没有填充 ProjectId 和 PersonId。

请问有什么建议吗?

这是我创建新项目的 HttpPost 方法

[HttpPost]
        public ActionResult CreateProject(Projects newProject, int page = 1)
        {


            _ctx.Projects.AddProject(newProject, ref _ctx);
            _ctx.Person.AddPerson(newProject.Person, newProject, ref _ctx);

            _ctx.SaveChanges();

var userProjects = _ctx.Projects.GetStaffUserProjects(providerUserKey, page, ref _ctx);
                    return PartialView("_Projects", userProjects);

        }

这是我的扩展方法,即“AddProject”和“AddPerson”

1) 添加项目

public static void AddProject(this IEnumerable<Project> projects, Projects newProject, ref DataContext ctx)
        {


               var project = new Project
                               {
                                   Title = newProject.Title,
                                   Duration = newProject.Duration,
                                   Description = newProject.Description,
                                   CreatedDate = DateTime.Now,
                                   Status = true,
                                   UserId = (int)Membership.GetUser().ProviderUserKey,
                                   ProjectCategoryId = newProject.SelectedProjectCategoryId,
                                   OrganizationId = newProject.SelectedOrganizationId
                               };




            ctx.Projects.Add(project);
        }

2) 添加人

public static void AddPerson(this IEnumerable<Person> persons, Person newPerson, Projects newProject, ref DataContext ctx)
        {



                   var person = new Person
                                   {
                                       Name = newPerson.Name,
                                       EmailAddress = newPerson.EmailAddress,
                                       CellPhone = newPerson.CellPhone,
                                       Designation = newPerson.Designation
                                   };



                ctx.Person.Add(person);
            }
        }
4

1 回答 1

1

为了创建人员和项目之间的关系,您必须将已添加或附加到上下文的项目添加到适当的导航集合中。为此(只需对现有代码进行最少的更改)从以下位置返回创建的项目AddProject

public static Project AddProject(this IEnumerable<Project> projects,
    Projects newProject, ref DataContext ctx)
{
   var project = new Project { ... };
   ctx.Projects.Add(project);
   return project;
}

然后将此返回的项目传递给AddPerson

var project = _ctx.Projects.AddProject(newProject, ref _ctx);
_ctx.Person.AddPerson(newProject.Person, project, ref _ctx);
_ctx.SaveChanges();

并将AddPerson其添加到该人的Projects收藏中:

public static void AddPerson(this IEnumerable<Person> persons, Person newPerson,
    Projects project, ref DataContext ctx)
{
    var person = new Person { ... };
    if (project != null)
        person.Projects.Add(project);
        // the preceding line tells EF about the relationship and will make it
        // generate an INSERT statement for the link table ProjectPerson
    ctx.Person.Add(person);
}
于 2013-10-23T18:36:15.993 回答