2010-07-13 3 views
0

ОК, мне сложно провести автоматизацию коллекций с использованием свободного 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> 

EDIT: @Bary: странное дело доступа = "nosetter.camelcase". Я думаю, что это должен быть доступ = "field.camelcase-underscore". Какие-либо предложения?

ответ

-3

Я выясняю это.

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

Решение:

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

Fluently.Configure(Configuration) 
       .Mappings(cfg => 
       { 
        cfg.AutoMappings.Add(*yourIAutomappingConfiguration*) 
       } 
+0

Хорошая работа. Я предполагаю, что код для стратегии доступа к конвенции о коллекции был не так уж плох в конце концов! – Berryl

+0

Да, это хорошо, но это не ответ на предыдущий вопрос просто потому, что отображение, сгенерированное для коллекции ISet , равно вместо . И я все еще не могу справиться с этим. – mynkow

+0

Нет, нет, нет. Посмотрите еще раз на конвенцию. Хорошо, вот подсказка; он работает на ICollection. Затем снова просмотрите свой код. Если вы все еще не можете понять это, я расскажу вам, как сгенерировать набор * правильно *. HTH – Berryl

Смежные вопросы