为什么Override()不能在NHibernate Fluent中工作

时间:2011-11-06 10:22:01

标签: nhibernate override fluent

我正在尝试在表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。但是数据库没有变化,这意味着生成Unique约束,无论我使用的是UpdateSchema()还是BuildSchema()。

BTW,执行时没有错误。

因此找到原因更难。但欢迎提出任何建议!

1 个答案:

答案 0 :(得分:0)

UserRoleProfile等在不同的程序集中是否真的存在?如果不是,您只需要一个.Add(AutoMap.AssemblyOf<T>()。这可能是您的问题,因为它可能会覆盖您在后续调用中的覆盖。我不是那么熟悉覆盖,但它值得一试。

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