Entity Framework сначала генерирует код / ​​таблицы неожиданным образом - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть много классов, представляющих таблицы, но три из них вызывают у меня головную боль: Персона, Задача и Роль, вот их код:

public class Person : BaseModel
{
        public int Id { get; set; }
        public string FName { get; set; }
        public string LName { get; set; }
        public string Title { get; set; }

        public ICollection<TestEvent> TestEventsLed { get; set; }
        public ICollection<TestEvent> TestEventsCreated { get; set; }
        public ICollection<Program> ProgramsLed { get; set; }
        public ICollection<Task> TasksCreated { get; set; }
        public ICollection<PersonalEvent> PersonalEventsCreated { get; set; }

        public virtual ICollection<Role> RolesHeld { get; set; }
        public virtual ICollection<Task> TasksAssigned { get; set; }
}

public class Role : BaseModel
{
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Person> PeopleWithThisRole { get; set; }
}

public class Task : BaseModel
{
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime SuspenseDatetime { get; set; }
        public DateTime CreatedDatetime { get; set; }
        public int CreatedById { get; set; }
        public bool Completed { get; set; }
        public bool Archived { get; set; }

        public Person CreatedBy { get; set; }

        public virtual ICollection<Person> PeopleAssigned { get; set; }
}

В итоге я получаю то, что хотел, кроменесколько икот:

Expected:                                       Actual:
- People should have 0 foreign keys, just       - People has 1 FK and 1 extra column out of
  2 many-to-manys for RolesHeld and               nowhere: Task_Id and the FK is for that
  TasksAssigned                                   new column referencing Id in Tasks?

- Task should have 1 foreign key for            - Task has 2 extra columns out of nowhere
  CreatedById linked to a Person                  called Person_Id and Person_Id1 and then
                                                  identical foreign keys attached to them
                                                  (and it has the expected CreatedById FK)

- There should be a RolePersons table           - This part happened correctly and with the 
  with 2 FKs to represent the many-to-many        correct FKs to represent the many-to-many

- There should be a TaskPersons table           - There is no new table at all for this
  with 2 FKs to represent the many-to-many  

Странная вещь, я сделал некоторые из них одинаково (например, два отношения «многие ко многим»), но тогда только 1 получилось правильно?Вы видите, что я сделал неправильно?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Иногда отображение по умолчанию - это не то, что нам нужно, поэтому мы должны явно сказать EF, что нам нужно.Просто добавьте этот метод в ваш DbContext, и он работает как требуется:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>().HasMany(p => p.TasksAssigned).WithMany(t => t.PeopleAssigned);
    modelBuilder.Entity<Person>().HasMany(p => p.TasksCreated).WithRequired(t => t.CreatedBy).WillCascadeOnDelete(false);
}
0 голосов
/ 01 декабря 2018

Entity Framework делает что-то по соглашению.

Посмотрите свой класс Task и класс Person

public class Task : BaseModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime SuspenseDatetime { get; set; }
    public DateTime CreatedDatetime { get; set; }
    public int CreatedById { get; set; }
    public bool Completed { get; set; }
    public bool Archived { get; set; }

    public Person CreatedBy { get; set; }

    public virtual ICollection<Person> PeopleAssigned { get; set; }
}


public class Person : BaseModel
{
    public int Id { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string Title { get; set; }

    public ICollection<TestEvent> TestEventsLed { get; set; }
    public ICollection<TestEvent> TestEventsCreated { get; set; }
    public ICollection<Program> ProgramsLed { get; set; }
    public ICollection<Task> TasksCreated { get; set; }
    public ICollection<PersonalEvent> PersonalEventsCreated { get; set; }

    public virtual ICollection<Role> RolesHeld { get; set; }
    public virtual ICollection<Task> TasksAssigned { get; set; }
}

В своем классе Task вы помещаете объект Person, а также коллекцию Person.Я думаю, именно в этом причина вашей головной боли.

Если вам нужно много-много отношений между ними, вам не следует помещать это свойство в ваш класс задач

 public Person CreatedById { get; set; }
 public Person CreatedBy { get; set; }

Или есливам нужно отношение один ко многим между ними, затем удалите это свойство из вашего класса задач

 public virtual ICollection<Person> PeopleAssigned { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...