Подскажите какие свойства нужно добавить в классы, чтобы настроить отношения между таблицами
У меня есть 4 таблицы в бд вакансии, работники, скилы и отделы. Когда я добавляю работника, то я могу выбрать ему несколько скилов, если я выбираю несколько скилов, но получаю ошибку SqlException: Cannot insert explicit value for identity column in table 'Skills' when IDENTITY_INSERT is set to OFF, я так понимаю мне нужно создать правильные отношения между таблицами. ну то есть добавить в таблицу Employee поля public Skill Skill и public int SkillId, что-то в этом роде, но я в этом не очень разбираюсь, подскажите как нужно мне сделать, чтобы когда я добавлял работника с двумя или больше скилами и в табилце Employee была ссылка на эти скилы или как правильнее сделать подскажите, как мне сохранять работника, чтобы у него было несколько скилов, притом 2 или 3 или 5, это уже должно выясняться автоматически, сколько выберешь в программе.
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string SecondName { get; set; }
public DateTime BirthDate { get; set; }
public decimal Salary { get; set; }
public bool Bonus { get; set; }
public List<Skill> Skills { get; set; }
public Employee(string name, string secondName, DateTime birth, decimal salary, bool bonus, List<Skill> skills)
{
Name = name;
SecondName = secondName;
BirthDate = birth;
Salary = salary;
Bonus = bonus;
Skills = skills;
}
public Employee() { }
}
public class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public Skill() { }
}
private void btnHireEmp_Click(object sender, EventArgs e)
{
var form = new HireEmploee();
if (form.ShowDialog() == DialogResult.OK)
{
db.Employees.Add(form.Employee);
db.SaveChanges();
MessageBox.Show(form.Employee.Name + ": was hired");
}
UpdateEmp();
}
Ответы (1 шт):
При настраивании отношений между моделями следует учитывать тот фактор что у зависимой сущности должен быть так званый внешний ключ. Это такое свойство в котором хранится первичный ключ главной сущности. Также название этого поля должно начинаться з названия класса главной сущности + Id. Например, название класса главной сущности Employee, поэтому в классе Skill должно быть свойство EmployeeId, с тем же типом что и первичный ключ у Employee(В вашем случае int). Также у обеих сущностей должно быть так званое навигационное свойство. Это поле с типом противоположной сущности для получения данных другой сущности. Звучит всё сложно но давайте разберёмся на вашем примере. В вашем случае Employee - главная сущность а Skill - зависимая. Также, так как один работник может иметь несколько скилов то отношение будет один ко многим. В классе Employee у вас всё верно, так как имеется навигационное свойство Skills, а вот в классе Skill отсутствует навигационное свойство указывающее на работника и внешний ключ также указывающий на него. Поэтому следует изменить класс Skill на подобие следующего примера:
public class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public Skill() { }
public Employee Employee { get; set; } // навигационное свойство
public int EmployeeId { get; set; } // внешний ключ
}
Также рекомендуется настроить отношение между моделями с помощью FluentAPI. Для этого добавьте следующий метод в класс контекста данных:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Employee>()
.HasMany(p => p.Skills)
.WithOne(p => p.Employee)
.HasForeignKey<Skill>(p => p.EmployeeId);
}
Также учитывайте что отношение между моделями ведёт к каскадному удалению. Это значит что при удалении главной сущности удалятся также и все зависимые. В вашем случае при удалении работника удалятся также и все скилы что были к нему привязаны. Также в вашем случае рекомендую использовать отношение многое к многим так как один работник может иметь несколько скилов и несколько работников могут иметь один и тот самый скил. Подробнее об отношении многое ко многом тут. Также прочтите вот эту статью об каскадном удалении, и эту статью об загрузке связных данных. Надеюсь что помог вам. Удачи.