2010-05-21 59 views
0

HI,Fluent NHibernate是否將ClassMap Id和SubClassMap Id引用到引用表中?

,我有以下實體我試圖映射:

public class Product { 
    public int ProductId { get; private set; } 
    public string Name { get; set; } 
} 

public class SpecialProduct : Product { 
    public ICollection<Option> Options { get; private set; } 
} 

public class Option { 
    public int OptionId { get; private set; } 
} 

而下面的映射:

public class ProductMap : ClassMap<Product> { 
    public ProductMap() { 
    Id(x => x.ProductId); 
    Map(x => x.Name); 
} 

public class SpecialProductMap : SubclassMap<SpecialProduct> { 
    public SpecialProductMap() { 
    Extends<ProductMap>(); 
    HasMany(p => p.Options).AsSet().Cascade.SaveUpdate(); 
    } 
} 

public class OptionMap : ClassMap<Option> { 
    public OptionMap() { 
    Id(x => x.OptionId); 
    } 
} 

的問題是,我的表落得這樣的:

Product 
-------- 
ProductId 
Name 

SpecialProduct 
-------------- 
ProductId 

Option 
------------ 
OptionId 
ProductId   // This is wrong 
SpecialProductId // This is wrong 

應該只有一個ProductId和單個r參照SpecialProduct表,但我們得到「兩個」ID和兩個對SpecialProduct.ProductId的引用。

任何想法?

感謝 安迪

+0

你能告訴你如何*想要*你的表最終? – Jay 2010-05-21 20:02:45

+0

有兩個'ProductId'列,因爲'SpecialProduct'表必須以某種方式返回到'Product',這是一個外鍵。 至於'選項'表,真的看起來錯了。您可能遇到了錯誤。我已經打開了[ticket](http://fluentnhibernate.lighthouseapp.com/projects/33236-fnh/tickets/184-hasmany-in-subclass-generates-wrong-foreign-keys),我會稍後進行調查。 – 2010-05-21 20:08:31

+0

我無法用所提供的信息重現您的問題。請您可以評論我之前鏈接到的門票,並提供儘可能多的額外信息。精簡的解決方案可以很好地解決問題。 – 2010-05-22 03:27:37

回答

1

感謝回饋大家。

的表,我想是這樣的:

Product 
-------- 
ProductId 
Name 

SpecialProduct 
-------------- 
ProductId 

Option 
------------ 
OptionId 
SpecialProductId // Which ends up being just product id, but the FK here is to SpecialtyProduct 

我忘了在我原來的問題添加此行到OptionMap類:

public class OptionMap : ClassMap<Option> {  
    public OptionMap() {  
    Id(x => x.OptionId);  
    References(x => x.ParentOption); 
    }  
} 

如果我然後用這個代替,它的工作原理如下:

public class OptionMap : ClassMap<Option> {  
    public OptionMap() {  
    Id(x => x.OptionId);  
    References(x => x.ParentOption).Column("SpecialProductId").Not.Nullable(); 
    }  
} 

看起來Fluent在添加「ProductId」時,由於引用了a nd沒有發現應用程序列已經在那裏。

相關問題