Соглашение Fluent Nhibernate Automap для ненулевого поля - PullRequest
7 голосов
/ 09 апреля 2010

Может ли кто-нибудь помочь, как бы я проинструктировал autop иметь not-null для столбец?

public class Paper : Entity
{
    public Paper() { }

            [DomainSignature]
            [NotNull, NotEmpty]
            public virtual string ReferenceNumber { get; set; }

            [NotNull]
            public virtual Int32 SessionWeek { get; set; }
}

Но я получаю следующее:

 <column name="SessionWeek"/>

Я знаю, что это можно сделать с помощью Fluent-Map. но я хотел бы знать это в способ автоматического картирования.

Ответы [ 5 ]

4 голосов
/ 09 апреля 2010

Спасибо. Также для справочных свойств необходимо сделать ReferenceConvention. Это код, который работает:

public class ColumnNullConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Property.MemberInfo.IsDefined(typeof(NotNullAttribute), false))
            instance.Not.Nullable();
    }

}  public class ReferenceConvention : IReferenceConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
    {
        instance.Column(instance.Property.Name + "Fk");


        if (instance.Property.MemberInfo.IsDefined(typeof(NotNullAttribute), false))
            instance.Not.Nullable();

    }
}
1 голос
/ 01 августа 2012

Если вы в основном удовлетворены результатами Automapping, но иногда вам нужно переопределить их, скажем, для пары свойств в классе, я считаю, что реализация IAutoMappingOverride для этого класса - самый простой способ добиться этого:

public class UserMappingOverride : IAutoMappingOverride<User>
{
      public void Override(AutoMapping<User> mapping)
      {
          mapping.Map(x => x.UserName).Column("User").Length(100).Not.Nullable();
      }
}

А затем используйте их так:

AutoMap.AssemblyOf<User>().UseOverridesFromAssemblyOf<UserMappingOverride>();

Похоже на ClassMaps - но вам не нужно описывать каждое поле в классе. Этот подход очень похож на API Code First Fluent API Entity Framework.

1 голос
/ 10 апреля 2010

Вот как я это делаю, в основном взято по ссылке, которую вы видите в коде. Там также есть и другие полезные соглашения

НТН,
Berryl

/// <summary>
/// If nullability for the column has not been specified explicitly to allow NULL, then set to “NOT NULL”.
/// </summary>
/// <remarks>see http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/</remarks>
public class ColumnNullabilityConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Nullable, Is.Not.Set);
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.Not.Nullable();
    }
}
0 голосов
/ 05 августа 2011

Я нахожу чаще, чем нет, мои столбцы не равны NULL, поэтому я предпочитаю сделать это соглашение и указать только столбцы как обнуляемые:

  /// <summary>
  /// Indicates that a column should allow nulls 
  /// </summary>
  [Serializable]
  [AttributeUsage(AttributeTargets.Property)]
  public class NullableAttribute : Attribute
  {
  }



 public class ColumnIsNotNullByDefaultConvention : IPropertyConvention, IPropertyConventionAcceptance
  {
    public void Apply(IPropertyInstance instance)
    {
      instance.Not.Nullable();
    }

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
      criteria.Expect(c => !c.Property.MemberInfo.IsDefined(typeof(NullableAttribute), false));
    }
  }
0 голосов
/ 09 апреля 2010
public class Paper Map : IAutoMappingOverride<Paper >
{
    public void Override(AutoMapping<Paper> mapping)
    {
        mapping.Map(x => x.ReferenceNumber).Not.Nullable();
    }
}

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

Вы можете использовать условные обозначения, чтобы сделать это автоматически. Я не уверен, какое соглашение использовать, но взгляните на FluentNHibernate.Conventions.Instances, чтобы найти правильный. Это будет выглядеть так.

public class ColumnConvention : IColumnConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.ColumnInstance instance)
    {
        if (instance.EntityType.IsDefined(typeof(NotNullAttribute), false))
            instance.NotNull = true;
    }

    public void Apply(FluentNHibernate.Conventions.Instances.IColumnInstance instance)
    {
        return;
    }
}

Просто добавьте это соглашение к вашему автопроявлению.

...