2016-09-21 78 views
0

我使用ClassMapping与NHibernate。我的属性之一,这样创建的索引:NHibernate ClassMapping创建自动唯一键

public class ShopMapping : ClassMapping<Shop> 
    { 
     public ShopMapping() 
     { 
      Table("Shops"); 
      Id(p => p.Id, m => m.Generator(NHibernate.Mapping.ByCode.Generators.GuidComb)); 

      Property(p => p.CountryCode, m => 
      { 
       m.Length(10); 
       m.NotNullable(true); 
       m.Index("ShopCountryCodeIdx"); 
       m.Unique(false); 
      }); 

     } 
    } 

这会生成一个名为ShopCountryCodeIdx指数,但我也有一个独特的指数,称为“COUNTRYCODE”在同一列。我试了一下没有m.Unique(false),但没有效果。 我刚搬到一台新电脑。旧电脑:32位VS2012和新电脑:64位VS2015。 NHiberate版本都是相同的(3.4.1.4)。数据库是MySQL 5.7(在我使用MySQL 5.5的旧机器上)。 这怎么可能?

+0

我只是重新运行代码(使用drop database object等),并用m.Unique(false)重新创建表,结果仍然在一个额外的索引'CountryCode'(不唯一)。忘了告诉CountryCode属性确实存在于多个对象中,所有这些与对象有关的表都有一个额外的索引'CountryCode' –

+0

编辑:遇到一些缓存问题,我猜CountryCode索引仍然是'唯一的'... :( –

回答

0

发现部分问题。我在其他ClassMapping类中有一个跨三列的唯一索引。其中一个也是CountryCode专栏。这导致了这种奇怪的行为。

Property(p => p.CountryCode, m => 
     { 
      m.Length(10); 
      m.NotNullable(true); 
      m.Index("PanelShopCountryCodeIdx"); 
      //m.UniqueKey("UK_psPanelShopnrIdx"); 
     }); 
     Property(p => p.ShopNr, m => 
     { 
      m.Length(25); 
      m.NotNullable(true); 
      //m.UniqueKey("UK_psPanelShopnrIdx"); 
     }); 
     Property(p => p.PanelCode, m => 
     { 
      m.Length(25); 
      m.NotNullable(true); 
      // m.UniqueKey("UK_psPanelShopnrIdx"); 
     }); 

摆脱那些m.UniqueKey语句,解决了这个问题(这让我和其他的挑战,如何在这种情况下,以创建跨三个列的唯一索引从一个列有也是自己的(非唯一)index ...