Nhibernate 是否使用Fluent AutoMap暂时关闭标识列?

Nhibernate 是否使用Fluent AutoMap暂时关闭标识列?,nhibernate,fluent,identity-column,Nhibernate,Fluent,Identity Column,我已经开始用C语言测试流利的NHibernate# 我有一个标准化的对象结构,有20个相关的类。 我目前使用Fluent 1.3和NHibernate 3.2。 到目前为止,我已经成功地使用了适合我的自动映射功能, 非常方便 但是。。。 其中3个表是“枚举表”,需要将其记录设置为特定的Id值。 我试图手动映射这些表,并让其余的自动映射。 但是创建手动表时失败,因为它引用了一个自动映射的表(手动映射器不可用?) 是否可以使用自动映射,但对于某些极少数类,会覆盖主键上的标识创建? 我试着制定一个习俗

我已经开始用C语言测试流利的NHibernate# 我有一个标准化的对象结构,有20个相关的类。 我目前使用Fluent 1.3和NHibernate 3.2。 到目前为止,我已经成功地使用了适合我的自动映射功能, 非常方便

但是。。。 其中3个表是“枚举表”,需要将其记录设置为特定的Id值。 我试图手动映射这些表,并让其余的自动映射。 但是创建手动表时失败,因为它引用了一个自动映射的表(手动映射器不可用?)

是否可以使用自动映射,但对于某些极少数类,会覆盖主键上的标识创建? 我试着制定一个习俗,但没有成功

public class OverrideIdentityGeneration : Attribute
{
}

public class ConventionIdentity : AttributePropertyConvention<OverrideIdentityGeneration>
{
    protected override void Apply(OverrideIdentityGeneration attribute, IPropertyInstance instance)
    {
        instance.Generated.Never();
    }
}
public类OverrideIdentityGeneration:属性
{
}
公共类约定性:属性属性属性
{
受保护的重写无效应用(OverrideIdentityGeneration属性,IPropertyInstance实例)
{
instance.Generated.Never();
}
}
还有别的办法吗? 如果被迫重新对所有类使用手动映射,那将是令人悲哀的

class MyIdConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        if (instance.EntityType == ...)
        {
            instance.GeneratedBy.Assigned();
        }
    }
}
更新:

对于类似枚举的类,将枚举定义为id通常更容易

class ConfigValue
{
    public virtual Config Id { get; set; }
}

// the convention is easy
if (instance.EntityType.IsEnum)
{
    instance.GeneratedBy.Assigned();
    // to save as int and not string
    instance.CustomType(typeof(Config));
}

// querying without magic int values
var configValue = Session.Get<ConfigValue>(Config.UIColor);
类配置值
{
公共虚拟配置Id{get;set;}
}
//会议很容易
if(instance.EntityType.IsEnum)
{
instance.GeneratedBy.Assigned();
//保存为int而不是string
CustomType(typeof(Config));
}
//不带魔法int值的查询
var configValue=Session.Get(Config.UIColor);

我使用了Fifo给出的思想,并将其扩展为使用自定义属性。 为了使代码可读并避免在其他约定中使用类似想法时出现冗余,我添加了一个扩展方法来检查自定义属性

这是我最后得到的代码:

/// <summary>
/// Convention to instruct FluentNHIbernate to NOT generate identity columns
/// when custom attribute is set.
/// </summary>
public class ConventionIdentity : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        if(instance.CustomAttributeIsSet<NoIdentity>())
            instance.GeneratedBy.Assigned();
    }
}

/// <summary>
/// Custom attribute definition.
/// </summary>
public class NoIdentity : Attribute
{
}

/// <summary>
/// Example on how to set attribute.
/// </summary>
public class Category
{
    [NoIdentity]
    public int Id { get; set; }
    public string Name { get; set; }
}

public static class IInspectorExtender
{
    /// <summary>
    /// Extender to make convention usage easier.
    /// </summary> 
    public static T GetCustomAttribute<T>(this IInspector instance)
    {
        var memberInfos = instance.EntityType.GetMember(instance.StringIdentifierForModel);
        if(memberInfos.Length > 0)
        {
            var customAttributes = memberInfos[0].GetCustomAttributes(false);
            return customAttributes.OfType<T>().FirstOrDefault();
        }
        return default(T);
    }
}
//
///指示FluentNHIbernate不生成标识列的约定
///设置自定义属性时。
/// 
公共类约定身份:IID约定
{
public void Apply(IIdentityInstance实例)
{
if(instance.customAttributeSet())
instance.GeneratedBy.Assigned();
}
}
/// 
///自定义属性定义。
/// 
公共类属性:属性
{
}
/// 
///关于如何设置属性的示例。
/// 
公共类类别
{
[噪音]
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共静态类IIInspector扩展器
{
/// 
///扩展程序,使约定的使用更容易。
///  
公共静态T GetCustomAttribute(此IIInspector实例)
{
var memberInfos=instance.EntityType.GetMember(instance.StringIdentifierModel);
如果(memberInfos.Length>0)
{
var customAttributes=memberInfos[0]。GetCustomAttributes(false);
返回customAttributes.OfType().FirstOrDefault();
}
返回默认值(T);
}
}

谢谢,效果很好!这是我错过的第三次会议。。。。在哪里可以找到包含所有可用约定的列表?我的下一个挑战是制定一个ForeignKeyConstraintNameConvention,但我又一次被困在猜测中……一种方法是键入
FluentNHibernate.Conventions.I
,然后让intellisense告诉您或查看OK,这现在完成了!