为什么Override()在NHibernate中不起作用

为什么Override()在NHibernate中不起作用,nhibernate,overriding,fluent,Nhibernate,Overriding,Fluent,我试图在table User的列LoginName上设置唯一约束。下面是我的代码: public FluentConfiguration GetNHConfig() { var cfg = new FreeflyingConfiguration(); return Fluently.Configure() .Database(MsSqlConfiguration.MsSql2005.ConnectionString(_con

我试图在table User的列LoginName上设置唯一约束。下面是我的代码:

    public FluentConfiguration GetNHConfig()
    {
        var cfg = new FreeflyingConfiguration();
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2005.ConnectionString(_connStr))
            .Mappings(m => m.AutoMappings
                .Add(AutoMap.AssemblyOf<LogOfArticle>(cfg))
                .Add(AutoMap.AssemblyOf<LogOfUser>(cfg))
            // here is the problem, I think
                .Add(AutoMap.AssemblyOf<User>(cfg).UseOverridesFromAssemblyOf<UserMappingOverride>())
                .Add(AutoMap.AssemblyOf<Role>(cfg))
                .Add(AutoMap.AssemblyOf<Profile>(cfg))
                .Add(AutoMap.AssemblyOf<Blog>(cfg))
                .Add(AutoMap.AssemblyOf<Comment>(cfg)));
    }


public class UserMappingOverride : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        // breakpoint is set here and can be hit every time
        mapping.Map(x => x.LoginName).Not.Nullable();
        mapping.Map(x => x.Email).Unique();
        mapping.Map(x => x.Profile.BlogUrl).Unique();
    }

}
可以生成表格,并且每次都可以点击线上的breakpiont。但数据库中并没有变化,这意味着,无论我使用UpdateSchema还是BuildSchema,都会生成唯一约束

顺便说一句,执行时没有错误

所以很难找到原因。但任何建议都是欢迎的

用户、角色、配置文件等是否真的在不同的程序集中?如果不是,你只需要一个。AddAutoMap.AssemblyOf。这可能是您的问题,因为它可能会覆盖后续调用中的覆盖。我不太熟悉覆盖,但值得一试

return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2005.ConnectionString(_connStr))
        .Mappings(m => m.AutoMappings
            .Add(AutoMap.AssemblyOf<User>(cfg)
            .UseOverridesFromAssemblyOf<UserMappingOverride>());

所有实体都位于同一集合中。但我看不出你的代码和我的代码有什么区别?你有7.AddAutoMap.AssemblyOf,我有1是的,你是对的。但是为什么呢?它不是在类上操作的,而是在程序集上操作的?如果它在程序集上操作,那么就容易多了,因为这样您就不必指定要映射的每个类。