2011-08-16 3 views
1

を上書きするか、条約でデフォルトの動作を変更することができます。」引用からであることを(流暢)NHibernateは:「参考文献と同様に、外部キーAUTHOR_IDデフォルト、あなたはKeyColumn方法..withそれを

を流暢なnhibernateマッピングガイド。この例ではAuthorクラスの主キーに正しい(列)名を使用するのではなく、なぜこれを行うのか理解できません。

public class SupplierMap : ClassMap<Supplier> 
{ 

    public SupplierMap() 
    { 
     Table("Suppliers"); 
     LazyLoad(); 
     Id(x => x.SupplierID, "SupplierID"); 
     Map(x => x.CompanyName).Not.Nullable(); 
     Map(x => x.ContactName); 
     Map(x => x.ContactTitle); 
     Map(x => x.Address); 
     Map(x => x.City); 
     Map(x => x.Region); 
     Map(x => x.PostalCode); 
     Map(x => x.Country); 
     Map(x => x.Phone); 
     Map(x => x.Fax); 
     Map(x => x.HomePage); 
     HasMany(x => x.Products).KeyColumn("ProductID").Inverse().Cascade.All(); 
    } 
} 

を、製品のマッピングは次のとおりです:

私が知っている、それは私自身のマッピングでここにあるよう.KeyColumn使用することで一つの解決策、(私の質問は、このコードの後に​​来ている)

public class ProductMap : ClassMap<Product> 
{ 

    public ProductMap() 
    { 
    Table("Products"); 
    LazyLoad(); 
     Id(x => x.ProductID); 
     References(x => x.Supplier, "SupplierID"); 
    Map(x => x.ProductName).Not.Nullable(); 
    Map(x => x.QuantityPerUnit); 
     Map(x => x.UnitPrice); 
    Map(x => x.UnitsInStock); 
     Map(x => x.UnitsOnOrder); 
     Map(x => x.ReorderLevel); 
    Map(x => x.Discontinued).Not.Nullable(); 

    } 
} 

私の質問は、よりエレガントな方法ですか? id(ProductIDとProduct_ID)の商品表に2つの列が表示されてしまったのはかなり残念です。前述のように、これは上記のようにKeyColumn( "ProductID")で修正されました。プロダクトマッピングや設定でもこれを設定できる方法はありますか?私は、「慣習でデフォルトの動作を上書きする」ことを理解しているとは思わない。おそらく答えがどこにあるのだろう。あなたのFKSはすべてその形式ObjectNameIDである場合、何をやっているのほとんどは、あなたがして、

+2

これは、質問のひどいタイトルです。将来これを見つけようとしている人を想像してください。 –

+0

私はstackoverflow自身の検索が非常に良いとは思わない、私は人々がGoogleを使用して答えを見つけると思う - それは彼らがスタックオーバーフローになるように意図されている...と私はタイトルがGoogleで大きな違いを作ることを疑う。 –

答えて

1

まずAutoMapperをオフに行うことができます

ProductIDとして Product.Idの列名を指定する必要が

+0

これをまだ試していないと、素晴らしいソリューションのように見えます。 –

0

public class CustomForeignKeyConvention : ForeignKeyConvention 
{ 
    protected override string GetKeyName(Member property, Type type) 
    { 
     if (property == null) 
      return type.Name + "Id"; 

     return property.Name + "Id"; 
    } 
} 

FKの名前を手動で指定する必要がないようにする必要があります。 PKのプロパティ名としてIdを使用していない場合は、PK規則を実行することもできます。

public class PrimaryKeyConvention : IIdConvention 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     instance.Column(instance.EntityType.Name + "Id"); 
    } 
} 

FNH docsから)私はFNHの期待と一致しないPK大会のご利用は、この場合は、あなたの問題であると思います。

+0

私はこれをしました:Id(x => x.ProductID、 "ProductID")。列( "ProductID");そして、私はまだ商品テーブルに2つのIDカラムを得ることができます.... –

関連する問題