8

automap に列の非 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 を使用して実行できることはわかっています。しかし、自動マッピングの方法で知りたいです。

4

5 に答える 5

6

ありがとうございました。また、参照プロパティについては、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();

    }
}
于 2010-04-09T13:36:40.387 に答える
1

基本的には、コードに表示されているリンクから取得した方法です。他にもいくつかの便利な規則があります

HTH、
ベリル

/// <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();
    }
}
于 2010-04-10T05:34:30.063 に答える
1

自動マッピングの結果にほとんど満足しているが、クラス内のいくつかのプロパティに対してオーバーライドする必要がある場合は、そのクラスに 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 に似ていますが、クラス内のすべてのフィールドを記述する必要はありません。このアプローチは、Entity Framework の Code First Fluent API の方法と非常によく似ています。

于 2012-08-01T07:56:39.403 に答える
0

多くの場合、私の列はnullではないため、この規則を作成し、列を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));
    }
  }
于 2011-08-05T10:58:39.240 に答える
0
public class Paper Map : IAutoMappingOverride<Paper >
{
    public void Override(AutoMapping<Paper> mapping)
    {
        mapping.Map(x => x.ReferenceNumber).Not.Nullable();
    }
}

Int32 は、既定では null 許容型ではありません。Int32? は null 許容なので、Int32 として指定するだけで null 非許容にできます。

規則を使用して、これを自動的に行うことができます。どの規則を使用すればよいかわかりませんが、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;
    }
}

この規則を自動マッピングに追加するだけです。

于 2010-04-09T09:05:33.177 に答える