Свободное отображение отношений NHibernate и исключение сохранения - PullRequest
0 голосов
/ 08 марта 2011

Я новичок в NHibernate и пытаюсь использовать возможность AutoMapping Fluent, чтобы мне не нужно было поддерживать отдельные XML-файлы вручную. К сожалению, я сталкиваюсь с проблемой со ссылками на сущности, в частности, ' Исключение произошло, метод получения Fluent_NHibernate_Demo.Domain.Name.Id ' - System.Reflection.TargetException: объект не соответствует типу цели .

Кажется, у меня есть ошибка по крайней мере в одном из моих классов сопоставления, хотя они генерируют правильный SQL (т. Е. Созданные таблицы имеют правильные индексы).

Реализации для моделей и отображений моего домена:


Name.cs

public class Name
{
    public virtual int Id { get; protected set; }
    public virtual string First { get; set; }
    public virtual string Middle { get; set; }
    public virtual string Last { get; set; }
}

Person.cs

public class Person
{
    public virtual int Id { get; protected set; }
    public virtual Name Name { get; set; }
    public virtual short Age { get; set; }
}

NameMap.cs

public NameMap()
{
    Table("`Name`");
    Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
    Map(x => x.First).Column("`First`").Not.Nullable().Length(20);
    Map(x => x.Middle).Column("`Middle`").Nullable().Length(20);
    Map(x => x.Last).Column("`Last`").Not.Nullable().Length(20);
}

PersonMap.cs

public PersonMap()
{
    Table("`Person`");
    Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
    References<Name>(x => x.Name.Id, "`NameId`").Not.Nullable();
    // There's no exception if the following line is used instead of References
    // although no constraint is created
    // Map(x => x.Name.Id).Column("`NameId`").Not.Nullable();
    Map(x => x.Age).Column("`Age`").Nullable();
}

Наконец, следующий код выдаст исключение:

Name name = new Name { First = "John", Last = "Doe" };
session.Save(name);
Person person = new Person { Name = name, Age = 22 };
session.Save(person); // this line throws the exception

Как уже упоминалось, созданная схема верна, но я не могу сохранить, используя приведенный выше код. Как правильно создать ограничение внешнего ключа с помощью Fluent NHibernate?

1 Ответ

1 голос
/ 09 марта 2011

Если вы хотите сослаться на имя по идентификатору, то это то, что вы должны сделать. NHibernate достаточно умен, чтобы выяснить, каким должно быть поле FK для Person и куда оно должно указывать; это, в конце концов, работа, для которой предназначена ORM.

Попробуйте это сопоставление:

public PersonMap()
{
    Table("`Person`");
    Id(x => x.Id).Column("`Id`").GeneratedBy.Identity();
    References(x => x.Name, "`NameId`").Not.Nullable();        
    Map(x => x.Age).Column("`Age`").Nullable();
}

Вы нанесли на карту человека и имя; в результате NHibernate знает, какое свойство является свойством ID для Name, и может создавать и проходить внешний ключ для Person.

...