Соглашение об автоматическом сопоставлении коллекций - PullRequest
0 голосов
/ 13 июля 2010

хорошо, у меня трудные времена с автоматическим сбором коллекций, используя свободный nhibernate.На этот раз я попытался применить соглашение о коллекции, которое просто говорит использовать camelCaseField с подчеркиванием.Хорошо, я загрузил соглашение и достиг точки останова в методе ниже FNH все еще производит странное отображение.Что я делаю не так?

public class Parent
{
    public virtual int Id { get; set; }
    private IList<Child> _testCollection;
    public virtual IList<Child> TestCollection
    {
        get
        {
            return _testCollection;
        }
    }
}
public class Child
{
    public virtual int Id { get; set; }
}

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

<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Test.Parent, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Parent`">
<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Id" />
  <generator class="identity" />
</id>
<bag access="nosetter.camelcase" name="TestCollection" mutable="true">
  <key>
    <column name="Parent_id" />
  </key>
  <one-to-many class="Test.Child, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

РЕДАКТИРОВАТЬ: @Bary: странная вещь - access = "nosetter.camelcase".Я думаю, что это должно быть access = "field.camelcase-underscore".Есть предложения?

1 Ответ

0 голосов
/ 14 июля 2010

Я понял.

Соглашения работают немного странно, но со временем, я думаю, я полностью осознаю это. Когда вы хотите применить соглашение к определенному свойству или чему-либо другому, оно будет применено, только если оно не настроено / не установлено / не определено. Таким образом, когда пользователь свободно компилирует сопоставления, он автоматически устанавливает свойства readonly для access = "nosetter.camelcase". К счастью, есть способ это исправить.

Решение:

Вы должны определить свою собственную конфигурацию автоматического преобразования с помощью расширения DefaultAutomappingConfiguration класса, а затем переопределить метод публичный виртуальный доступ GetAccessStrategyForReadOnlyProperty (Member member) ИЛИ просто реализуйте интерфейс IAutomappingConfiguration . После того, как вы закончите, вы можете добавить эту конфигурацию при инициализации свободной конфигурации.

Fluently.Configure( Configuration )
                .Mappings( cfg =>
                {
                    cfg.AutoMappings.Add( *yourIAutomappingConfiguration* )
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...