Быстрый NHibernate Многие к одному отображению

Я являюсь новым для Спящего режима мира. Это может быть глупый вопрос, но я не могу решить его. Я тестирую многих к отношениям таблиц и пытаюсь вставить запись. У меня есть таблица 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 ()]"

6
задан ChrisWue 27 June 2011 в 01:19
поделиться

3 ответа

Ответ Маттиаса почти правильный, но 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(); 
   } 
}
8
ответ дан 16 December 2019 в 21:38
поделиться
[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);
}
0
ответ дан 16 December 2019 в 21:38
поделиться

Проблема в том (как сообщается в сообщении об ошибке), что у вас нет столбца с именем «Dept_id». Ваше имя столбца вместо "DeptId". Соглашение по умолчанию для fluent nhibernate состоит в том, что имя должно быть с подчеркиванием. Чтобы решить эту проблему, вы можете просто изменить имя столбца в своей базе данных или переопределить соглашение в вашем файле сопоставления, чтобы указать ему вместо этого использовать ваше имя столбца. Это можно сделать следующим образом:

//EmployeeMapping
References(x => x.Dept).ForeignKey("DeptId").Cascade.None();

//DeptMapping
HasMany(x => x.Employees).KeyColumn("DeptId").Inverse() .Cascade.All();
0
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: