Я являюсь новым для Спящего режима мира. Это может быть глупый вопрос, но я не могу решить его. Я тестирую многих к отношениям таблиц и пытаюсь вставить запись. У меня есть таблица Department и Список сотрудников. У сотрудника и Отдела есть многие к отношениям здесь. Я использую Быстрый NHibernate для добавления записей. Все коды ниже. Помогите
Код SQL
create table Dept (
Id int primary key identity,
DeptName varchar(20),
DeptLocation varchar(20)
);
create table Employee (
Id int primary key identity,
EmpName varchar(20),
EmpAge int,
DeptId int references Dept(Id)
);
Файлы класса
public partial class Dept
{
public virtual System.String DeptLocation { get; set; }
public virtual System.String DeptName { get; set; }
public virtual System.Int32 Id { get; private set; }
public virtual IList<Employee> Employees { get; set; }
}
public partial class Employee
{
public virtual System.Int32 DeptId { get; set; }
public virtual System.Int32 EmpAge { get; set; }
public virtual System.String EmpName { get; set; }
public virtual System.Int32 Id { get; private set; }
public virtual Project.Model.Dept Dept { get; set; }
}
Отображение файлов
public class DeptMapping : ClassMap<Dept>
{
public DeptMapping()
{
Id(x => x.Id);
Map(x => x.DeptName);
Map(x => x.DeptLocation);
HasMany(x => x.Employees).Inverse().Cascade.All();
}
}
public class EmployeeMapping : ClassMap<Employee>
{
public EmployeeMapping()
{
Id(x => x.Id);
Map(x => x.EmpName);
Map(x => x.EmpAge);
Map(x => x.DeptId);
References(x => x.Dept).Cascade.None();
}
}
Мой Код для добавления
try
{
Dept dept = new Dept();
dept.DeptLocation = "Austin";
dept.DeptName = "Store";
Employee emp = new Employee();
emp.EmpName = "Ron";
emp.EmpAge = 30;
IList<Employee> empList = new List<Employee>();
empList.Add(emp);
dept.Employees = empList;
emp.Dept = dept;
IRepository<Dept> rDept = new Repository<Dept>();
rDept.SaveOrUpdate(dept);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Здесь я получаю ошибку как
InnerException = {"Недопустимое имя столбца 'Dept_id'".} сообщение = "не могло вставить: [Проект. Модель. Сотрудник] [SQL: INSERT INTO [Сотрудник] (EmpName, EmpAge, DeptId, Dept_id) ЗНАЧЕНИЯ (????); выберите SCOPE_IDENTITY ()]"
Ответ Маттиаса почти правильный, но ForeignKey используется для генерации схемы.Попробуйте вместо этого сопоставление ниже. Кроме того, у вас есть коллекция сотрудников, сопоставленная с CascadeAll. Это приведет к удалению записей сотрудников, если вы удалите отдел, что, вероятно, нежелательно.
public class DeptMapping : ClassMap<Dept>
{
public DeptMapping()
{
Id(x => x.Id);
Map(x => x.DeptName);
Map(x => x.DeptLocation);
HasMany(x => x.Employees).KeyColumn("DeptId").Inverse().Cascade.All();
}
}
public class EmployeeMapping : ClassMap<Employee>
{
public EmployeeMapping()
{
Id(x => x.Id);
Map(x => x.EmpName);
Map(x => x.EmpAge);
Map(x => x.DeptId);
References(x => x.Dept, "DeptId").Cascade.None();
}
}
[Serializable]
public partial class Dept
{
public virtual System.String DeptLocation { get; set; }
public virtual System.String DeptName { get; set; }
public virtual System.Int32 Id { get; private set; }
//public virtual Iesi.Collections.Generic.ISet<Employee> Employees { get; set; }
public virtual IList<Employee> Employees { get; set; }
public Dept()
{
Employees = new List<Employee>();
}
public virtual void AddEmployees(Employee employee)
{
employee.Dept = this;
Employees.Add(employee);
}
}
Класс сотрудника
public partial class Employee
{
//public virtual System.Int32 DeptId { get; set; }
public virtual System.Int32 EmpAge { get; set; }
public virtual System.String EmpName { get; set; }
public virtual System.Int32 Id { get; private set; }
public virtual Project.Model.Dept Dept { get; set; }
}
Код для вызова метода
try
{
Dept dept = new Dept();
dept.DeptLocation = "Austin";
dept.DeptName = "Store";
Employee emp = new Employee();
emp.EmpName = "Ron";
emp.EmpAge = 30;
dept.AddEmployees(emp);
IRepository<Dept> rDept = new Repository<Dept>();
rDept.Add(dept);
}
Проблема в том (как сообщается в сообщении об ошибке), что у вас нет столбца с именем «Dept_id». Ваше имя столбца вместо "DeptId". Соглашение по умолчанию для fluent nhibernate состоит в том, что имя должно быть с подчеркиванием. Чтобы решить эту проблему, вы можете просто изменить имя столбца в своей базе данных или переопределить соглашение в вашем файле сопоставления, чтобы указать ему вместо этого использовать ваше имя столбца. Это можно сделать следующим образом:
//EmployeeMapping
References(x => x.Dept).ForeignKey("DeptId").Cascade.None();
//DeptMapping
HasMany(x => x.Employees).KeyColumn("DeptId").Inverse() .Cascade.All();