Свободное использование NHibernate PropertyNotFoundException для автоматического свойства

Я пытаюсь заставить Fluent NHibernate отобразить для меня коллекцию. Мои определения классов следующие:

public abstract class Team 
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}

public class ClientTeam : Team
{
    public virtual IEnumerable<Client> Clients { get; set; }
}

public class Client
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Identifiers { get; set; }
}

Мои сопоставления:

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        Table("Team");
        Id(x => x.Id).GeneratedBy.Assigned();
        Map(t => t.TeamName);
    }
}

public class ClientTeamMap : SubclassMap<ClientTeam>
{
    public ClientTeamMap()
    {
        HasMany(t => t.Clients);
    }
}

public class ClientMap : ClassMap<Client>
{
    public ClientMap()
    {
        Table("Client");
        Id(c => c.Id);
        Map(c => c.Name);
        Map(c => c.Identifiers);
    }
}

Я создал модульный тест, который создает экземпляр команды, а затем пытается сохранить его (в тестовой базе есть конфигурация зависимостей и т. Д.):

public class TeamMapTester : DataTestBase
{
    [Test]
    public void Should_persist_and_reload_team()
    {
        var team = new ClientTeamDetail
        {
            Id = Guid.NewGuid(),
            TeamName = "Team Rocket",
            Clients = new[] 
            {
                new ClientDetail {ClientName = "Client1", ClientIdentifiers = "1,2,3"}
            }
        };

        using (ISession session = GetSession())
        {
            session.SaveOrUpdate(team);
            session.Flush();
        }

        AssertObjectWasPersisted(team);
    }
}

Когда я запускаю тест, я получаю такую ​​ошибку:

SetUp: FluentNHibernate.Cfg.FluentConfigurationException: при создании SessionFactory использовалась недопустимая или неполная конфигурация. Проверьте коллекцию PotentialReasons и InnerException для получения дополнительных сведений.

  • База данных не была настроена с помощью метода базы данных.

----> NHibernate.MappingException: не удалось скомпилировать документ сопоставления: (XmlDocument)
----> NHibernate.PropertyNotFoundException: не удалось найти поле '_clients' в классе 'ClientTeam'

Я просмотрел документацию NHibernate и выполнил поиск в Google, но не могу найти ничего, что могло бы решить эту проблему. В документации для методов Referencing Fluent NHibernate явно используются свойства auto, поэтому я уверен, что проблема не в этом.

Почему NHibernate может подумать, что _clients - это поле, которое он должен отображать в этом случае?


person Matt Mills    schedule 29.10.2010    source источник
comment
Я подозреваю, что нам не хватает некоторых важных частей. _clients должен быть где-то определен. Свойство auto Clients не имеет _clients в качестве реализации поля. Возникает вопрос: почему Fluent думает, что где-то есть поле _clients?   -  person Pieter van Ginkel    schedule 29.10.2010
comment
Это очень хороший момент; Я обновил вопрос, чтобы отразить это. Я вернулся и просмотрел документацию (wiki.fluentnhibernate.org/Fluent_mapping) и все их примеры использовать свойства авто.   -  person Matt Mills    schedule 29.10.2010


Ответы (1)


И причина оказывается: Conventions.

Сопоставления Fluent были настроены, чтобы попытаться принудительно применить свойства коллекции только для чтения, требуя резервного поля. Рассматриваемый ICollectionConvention:

public class CollectionAccessConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance)
    {
        instance.Fetch.Join();
        instance.Not.LazyLoad();
        instance.Access.CamelCaseField(CamelCasePrefix.Underscore);
    }
}

который требует, чтобы вспомогательные поля коллекции были верблюжьими и начинались с подчеркивания.

person Matt Mills    schedule 29.10.2010