0

次のように定義された2つのエンティティクラスがあります

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


        }

    }

新しいプロジェクトを作成した後、プロジェクト テーブルと Person テーブルにそのレコードが入力されますが、結合によって作成された 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) AddPerson

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 に答える