Convenção Fluente de Automap
-
25-09-2019 - |
Pergunta
Alguém poderia ajudar, como eu instruiria o Automap a não ter nulo para uma coluna?
public class Paper : Entity
{
public Paper() { }
[DomainSignature]
[NotNull, NotEmpty]
public virtual string ReferenceNumber { get; set; }
[NotNull]
public virtual Int32 SessionWeek { get; set; }
}
Mas estou recebendo o seguinte:
<column name="SessionWeek"/>
Eu sei que isso pode ser feito usando um mapa fluente. Mas eu gostaria de conhecê-lo de maneira automática.
Solução
Obrigada. Além disso, para as propriedades de referência, a referência de referência precisa ser feita. Este é o código que funciona:
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();
}
}
Outras dicas
Aqui está a maneira como eu faço isso, basicamente retirado do link que você vê no código. Existem outras convenções úteis lá também
Hth,
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();
}
}
Se você está satisfeito com os resultados de automappapa, mas ocasionalmente precisa substituí -lo por dizer algumas propriedades em uma aula, acho que a implementação de uma referência para a classe para essa classe é a maneira mais fácil de conseguir isso:
public class UserMappingOverride : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
mapping.Map(x => x.UserName).Column("User").Length(100).Not.Nullable();
}
}
E então use -os assim:
AutoMap.AssemblyOf<User>().UseOverridesFromAssemblyOf<UserMappingOverride>();
Semelhante aos mapas de classe - mas você não precisa descrever todos os campos da classe. Essa abordagem é muito semelhante à primeira maneira da API Fluent da estrutura da Entidade.
public class Paper Map : IAutoMappingOverride<Paper >
{
public void Override(AutoMapping<Paper> mapping)
{
mapping.Map(x => x.ReferenceNumber).Not.Nullable();
}
}
INT32 não é tipo anulado por padrão. Int32? é anulável, então você o torna inútil apenas especificando-o como INT32.
Você pode usar convenções para fazer isso automaticamente. Não tenho certeza de qual convenção usar, mas dê uma olhada no fluentnhibernate.Conventions.instances para encontrar a certa. Vai ficar assim.
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;
}
}
Basta adicionar esta convenção ao seu automappo.
Acho que, na maioria das vezes, minhas colunas não são nulas, então prefiro fazer esta convenção e especificar apenas colunas como anuláveis:
/// <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));
}
}