非空字段的流畅Nhibernate Automap约定

时间:2010-04-09 08:19:01

标签: fluent-nhibernate nullable automapping convention

可能有人帮忙,我如何指示automap为null-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"/>

我知道可以使用流利地图完成。但我想知道它 自动映射方式。

5 个答案:

答案 0 :(得分:4)

谢谢。此外,对于参考属性,需要完成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 :(得分:1)

这是我的方式,基本上取自你在代码中看到的链接。

还有一些其他有用的约定

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();
    }
}

答案 2 :(得分:1)

如果您对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类似 - 但您不需要描述类中的每个字段。 这种方法与实体框架的Code First Fluent API方式非常相似。

答案 3 :(得分:0)

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;
    }
}

只需将此约定添加到自动化中即可。

答案 4 :(得分:0)

我经常发现,我的列不是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));
    }
  }