我是Hibernate世界的新手。这可能是一个愚蠢的问题,但我无法解决它。我正在测试表的多个到一个关系并试图插入记录。我有一个Department表和Employee表。员工和部门在这里有多对一的关系。我正在使用Fluent 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'。”} Message =“无法插入:[Project.Model.Employee] [SQL:INSERT INTO [Employee](EmpName,EmpAge,DeptId,Dept_id)VALUES(?,?,?,?);选择SCOPE_IDENTITY()]”
答案 0 :(得分:8)
Mattias的答案几乎是正确的,但ForeignKey用于模式生成。请尝试以下映射。此外,您还有使用CascadeAll映射的Employees集合。如果删除部门,这将删除员工记录,这可能是不可取的。
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();
}
}
答案 1 :(得分:0)
问题是(正如错误消息所示)您没有名为“Dept_id”的列。您的列名称是“DeptId”。流畅的nhibernate的默认约定是名称应该是下划线。要解决此问题,您可以更改数据库中列的名称,或者可以覆盖映射文件中的约定,以告诉它使用您的列名称。这可以通过这种方式完成:
//EmployeeMapping
References(x => x.Dept).ForeignKey("DeptId").Cascade.None();
//DeptMapping
HasMany(x => x.Employees).KeyColumn("DeptId").Inverse() .Cascade.All();
答案 2 :(得分:0)
[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);
}