2012-02-23 5 views
1

私はそれにカテゴリプロパティを持つ製品クラスがあるとしましょう。外部キー用に2つの列が作成されるのはなぜですか?

public class Product : Entity<int> // Base class defines the Id 
{ 
    public virtual ProductCategory Category { get; set; } 
} 

マッピングファイルには、これは私のデータベースに2つの列を作成しProductCategoryIdCategoryIdSchemaExport.Createを使用して

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
    Id(x => x.Id); 
    References(x => x.Category).Nullable(); 
    } 
} 

簡単です。私の慣習を考えると、CategoryIdのみが存在するはずです。どちらもヌル入力可能ですが、CategoryIdのみが使用されます。何があっても、ProductCategoryIdは常にnullであり、それに外部キー制約のある列です。

これはなぜですか? CategoryId列を使用してすべてがうまく動作することが分かる限り、実際にコードに問題は見つかりません。カテゴリの有無にかかわらずクエリ/保存/更新ができます。データベースを調べていないと他の列が存在することはわかりませんが、それが何であるかわからないときは列があるのが好きではありません。そこに理由があるのですか、null可能な参照をマッピングした方法に何か問題がありますか?

答えて

0

よく問題は、ProductまたはProductMapクラスとは関係がありません。問題はProductCategory地図で問題です。

これは、データベースにProductCategoryIdという列を作成することです。

public class ProductCategoryMap : ClassMap<ProductCategory> 
{ 
    public ProductCategoryMap() 
    { 
     Id(x => x.Id); 
     // Other mappings 
     HasMany(x => x.Products).Inverse().Cascade.AllDeleteOrphan(); 
    } 
} 

このマッピングは、それが既存のCategoryId列を使用してすることになったことを伝えることができませんでした。マッピングファイルに指定するか、またはProductクラスのCategoryプロパティの名前をProductCategoryに変更すると、別の列の作成が強制的に停止されます。

関連する問題