NHibernate ComponentAsId () фактически не устанавливает свойство Id - PullRequest
3 голосов
/ 30 декабря 2011

Я пытаюсь настроить NHibernate (3.2.0.4000) с использованием кодированного сопоставления, но не могу заставить компонент ComponentAsId работать должным образом.

У меня есть схема базы данных, которую я не могу изменить, где основнойКлюч состоит из строки и даты, поэтому мне нужно использовать компонент в качестве идентификатора:

т.е.

Схема базы данных

Id varchar(20) NOT NULL,
EffectiveDate datetime NOT NULL,
Property1 int

Классы

public class EffectiveDateId
{
    public string Id { get; set; }
    public DateTimeOffset EffectiveDate { get; set; }
}
public class MyClass
{
    public EffectiveDateId Identity { get; set; }
    public int Property1 { get; set; }
}

Отображение

var mapper = new ConventionModelMapper();

mapper.Class<MyClass>(map => map.ComponentAsId(id => id.Identity, cid =>
{
    cid.Property(x => x.Id, x => x.Length(20));
    cid.Property(x => x.EffectiveDate);
}));

Но это не работает, поскольку свойство Identity в MyClass равно нулю.

Отображение в формате XML выглядит следующим образом:

<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2">
    <class name="Test.MyClass, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <composite-id class="EffectiveDateId, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
            <key-property name="Id" type="AnsiString" length="20" />
            <key-property name="EffectiveDate" />
        </composite-id>
        <property name="Property1" />
    </class>
</hibernate-mapping>

Однако, если я вручную изменю XML, чтобы включить name = "Identity" следующим образом:

<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2">
    <class name="Test.MyClass, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <composite-id name="Identity" class="EffectiveDateId, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
            <key-property name="Id" type="AnsiString" length="20" />
            <key-property name="EffectiveDate" />
        </composite-id>
        <property name="Property1" />
    </class>
</hibernate-mapping>

, это будет работать.

Я попытался установить идентификатор, добавив(в дополнение к сопоставлению ComponentAsId)

mapper.Class<MyClass>(map => map.Id(id => id.Identity));

, но это просто генерирует NHibernate.MappingException

Неоднозначное сопоставление идентификатора Test.MyClass.Было определено свойство id с генератором, и вы пытаетесь сопоставить компонент Test.EffectiveDateId со свойством 'Identity' как идентификатор для Test.MyClass.

Используя отладчик, я вижу, чтодля конфигурации с отображением кода ClassMapping.IdentifierProperty имеет значение null, а в конфигурации XML для него задан экземпляр NHibernate.Mapping.Property.

Итак, существует ли ошибка в реализации ComponentAsId (), котораяне устанавливается свойство IdentifierProperty или я делаю это неправильно?

привет, Eamon

...