2011-11-06 53 views
0

我試圖在表User的列LoginName上設置一個唯一的約束。因此,以下是我的代碼:爲什麼Override()不能在NHibernate Fluent中工作

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(),都會生成Unique約束。

順便說一句,執行時沒有錯誤。

所以很難找到原因。但任何建議都是值得歡迎的!

回答

0

User,Role,Profile等真的在不同的程序集?如果他們不是,你只需要一個.Add(AutoMap.AssemblyOf<T>()。這可能是您的問題,因爲它可能會覆蓋您的覆蓋隨後的調用。我並不是那些熟悉覆蓋的人,但它值得一試。

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

所有實體都處於相同的組合中。但是我的代碼和我的代碼沒有區別? – freeflying

+0

你有7'.Add(AutoMap.AssemblyOf ()',我有1 –

+0

是的,你說得對,但是爲什麼?它不是在Class上運行,而是在組裝上運行? – freeflying

相關問題