Fluent nhibernate 非空字段的Fluent Nhibernate自动映射约定
有人能帮忙吗,我该如何指示automap不为空 专栏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
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>();