Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fluent nhibernate 非空字段的Fluent Nhibernate自动映射约定_Fluent Nhibernate_Nullable_Automapping_Convention - Fatal编程技术网

Fluent nhibernate 非空字段的Fluent Nhibernate自动映射约定

Fluent nhibernate 非空字段的Fluent Nhibernate自动映射约定,fluent-nhibernate,nullable,automapping,convention,Fluent Nhibernate,Nullable,Automapping,Convention,有人能帮忙吗,我该如何指示automap不为空 专栏 public class Paper : Entity { public Paper() { } [DomainSignature] [NotNull, NotEmpty] public virtual string ReferenceNumber { get; set; } [NotNull] public v

有人能帮忙吗,我该如何指示automap不为空 专栏

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"/>

我知道这可以用流畅的地图来完成。但我想知道它在哪里 自动映射方式

public class Paper Map : IAutoMappingOverride<Paper >
{
    public void Override(AutoMapping<Paper> mapping)
    {
        mapping.Map(x => x.ReferenceNumber).Not.Nullable();
    }
}

只需将此约定添加到自动映射中。

谢谢。此外,对于参考属性,还需要进行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();

    }
}

下面是我的方法,基本上是从代码中看到的链接中获取的。还有一些其他有用的约定

HTH,
贝里尔

//
///如果该列的可空性未明确指定为允许NULL,则设置为“NOTNULL”。
/// 
///看http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/
公共类列NullabilityConvention:IPropertyConvention,IPropertyConvention Acceptance
{
公共无效接受(IAcceptanceCriteria标准)
{
Expect(x=>x.Nullable,Is.Not.Set);
}
公共无效应用(IPropertyInstance实例)
{
instance.Not.Nullable();
}
}

我经常发现,我的列不为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));
    }
  }
//
///指示列应允许空值
/// 
[可序列化]
[AttributeUsage(AttributeTargets.Property)]
公共类NullableAttribute:属性
{
}
公共类列不为NullByDefaultConvention:IPropertyConvention,IPropertyConventionAcceptance
{
公共无效应用(IPropertyInstance实例)
{
instance.Not.Nullable();
}
公共无效接受(IAcceptanceCriteria标准)
{
Expect(c=>!c.Property.MemberInfo.IsDefined(typeof(NullableAttribute),false));
}
}

如果您对自动映射结果非常满意,但偶尔需要为一个类中的几个属性覆盖它,我发现为该类实现IAutoMappingOverride是实现这一点的最简单方法:

public class UserMappingOverride : IAutoMappingOverride<User>
{
      public void Override(AutoMapping<User> mapping)
      {
          mapping.Map(x => x.UserName).Column("User").Length(100).Not.Nullable();
      }
}
public类UserMappingOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Map(x=>x.UserName).Column(“User”).Length(100).Not.Nullable();
}
}
然后像这样使用它们:

AutoMap.AssemblyOf<User>().UseOverridesFromAssemblyOf<UserMappingOverride>();
AutoMap.AssemblyOf().UseOverridesFromAssemblyOf();
类似于类映射-但是您不需要描述类中的每个字段。
这种方法与Entity Framework的Code First Fluent API非常相似。

谢谢,但是如果我的应用程序中的许多实体中有许多属性不是空的,该怎么办呢。我是否要全部覆盖它们?但我觉得这听起来不太对。nHibernate验证器是一个独立的东西。您必须检查自动映射中的属性。非常感谢您的回复。好啊因此,这确实意味着没有自动映射约定来指示Fluent Nhibernate将字段指定为非空,然后覆盖应用程序的所有属性。这让我意识到AutoMap缺少一个非常基本的功能。如果我需要覆盖每个类映射,因为大多数类映射都有或多或少的“NOTNULL”字段,那么为什么有人要在fluent映射上使用自动映射呢。请分享您的想法。不,它并不缺少功能,因为NHibernate验证器不是NHibernate的一部分,它是一个扩展。你不必每次都写。我已经更新了我的答案,向您展示了您可以做什么。(instance.EntityType.IsDefined(typeof(NotNullAttribute),false)这总是返回false,导致未应用约定。我不确定如何检测属性的存在。我也用PropertConvesEntion尝试过这一点,它与ISSUE相同。不过感谢您的持续支持。这对我来说效果最好。我还为非空引用实现了类似约定正如在另一篇文章中提到的。但是使用这种格式。只需将IPropertyConvention和IPropertyConventionAcceptance更改为使用IReferenceConvention和IReferenceConventionAcceptance。
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>();