2013-09-05 3 views
0

TL; DRNHibernate Per таблица, формула ссылка родитель preoperty

Возьмите "подклассы" пример отсюда

https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping.

Я хочу иметь формулу ChildMap, которая использует Name свойство Parent

Long Детали

У меня есть иерархия наследования (Product ->StockProduct, KitProduct, ListingProduct, VariationParentProduct) с Таблица Inventory_Product, содержащая все общие поля, и Inventory_StockProduct/Inventory_KitProduct и т. Д. С конкретными полями для подкласса. Я считаю, что это называется отображением таблицы подкласса.

В моем базовом классе Product У меня есть свойство под названием ProductType.

public abstract class Product 
{ 
    public virtual Guid ProductID { get; set; } 

    public abstract ProductType ProductType { get; } 

    public virtual int AvailableQuantity { get; set; } 
} 

public class StockProduct : Product 
{ 
    // Some other fields 
    public override ProductType ProductType 
    { 
     get { return ProductType.Stock; } 
    } 
} 

public class KitProduct : Product 
{ 
    // Some other fields 
    public override ProductType ProductType 
    { 
     get { return ProductType.Kit; } 
    } 
} 

public class ListingProduct : Product 
{ 
    // Some other fields 
    public override ProductType ProductType 
    { 
     get { return ProductType.Listing; } 
    } 
} 

public class VariationParentProduct : Product 
{ 
    // Some other fields 
    public override ProductType ProductType 
    { 
     get { return ProductType.VariationParent; } 
    } 
} 

public enum ProductType 
{ 
    Stock = 0, 
    Kit = 1, 
    Listing = 2, 
    VariationParent = 3 
} 

И отображения

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
     Table("Inventory_Products"); 

     Id(x => x.ProductID).GeneratedBy.Guid(); 
     Map(x => x.Sku); 

     Map(x => x.ProductType).CustomType<ProductType>().Access.ReadOnly(); 
    } 
} 

public class StockProductMap : SubclassMap<StockProduct> 
{ 
    public StockProductMap() 
    { 
     Table("Inventory_StockProducts"); 

     KeyColumn("ProductID"); 

     Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (1) ELSE NULL END)"); 
    } 
} 

public class KitProductMap : SubclassMap<KitProduct> 
{ 
    public KitProductMap() 
    { 
     Table("Inventory_KitProducts"); 

     KeyColumn("ProductID"); 

     Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (2) ELSE NULL END)"); 
    } 
} 

мне нужно каким-то образом получить доступ к этому в формуле, определенной на StockProduct/KitProduct делать различные SQL

Я попытался на StockProduct

Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 0 THEN (1) ELSE NULL END)") 

и KitProduct

Map(x => x.AvailableQuantity).Formula("(CASE ProductType WHEN 1 THEN (2) ELSE NULL END)") 

Но NHibernate префиксы ProductType с псевдонимом таблицы для [KitProduct | StockProduct], а не базовый продукт. Таким образом, его ссылка не существует

Есть ли эквивалент this. в формуле для родительского объекта?

+0

'ProductType' может быть 1 или 0? – user2586804

+0

Поместите всю вашу карту и классы в вопрос. – user2586804

+0

Пожалуйста, отправьте пример кода, чтобы мы могли вам помочь. Кроме того, в будущем обязательно отметьте свой код как код, чтобы сделать его более читаемым! – StormeHawke

ответ

0

Я думаю, что неплохой дизайн имеет как иерархию классов, так и свойство, чтобы рассказать вам, что это за конкретный класс. Вам, безусловно, не нужна эта колонка для реализации Таблица за Класс.

Вы должны использовать это в базовом классе:

UseUnionSubclassForInheritanceMapping(); 

И это в отображениях суб-классы:

Abstract(); 

Однако, я думаю, что вы пытаетесь достичь Таблица в Тип

См. Эту статью для хорошего объяснения трех разных mappi ng стратегий: http://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat

+0

Я понимаю различия. Возможно, я должен объяснить основную проблему, которую я пытаюсь решить. Я не _need_ столбец Тип, я просто пытался использовать его для решения моей конечной проблемы. Я хочу, чтобы для SQL-класса для каждого подкласса выполнялся отдельный SQL-запрос. По умолчанию nHibernate запускает SQL для каждого типа подкласса для каждого подкласса, а затем использует только соответствующий SQL для заполнения объекта Этот SQL может быть довольно дорогостоящим и поэтому неэффективно запускать SQL для ListProduct, VariationParentProduct и KitProduct, когда все Я хочу, чтобы это имело значение для моего StockProduct –

+0

Я забыл добавить, вещь unionubclass кажется очень неэффективной. если я хочу сделать запрос в поле, которое находится в родительском классе, тогда ему нужно сделать объединение. –

+0

@AndrewMurphy Ну, в моем опыте это неэффективно, я использую его на огромных столах, пока клавиши присутствуют на обеих столах, он работает очень быстро. Я не понимаю, какой другой SQL вы хотите запустить для двух подклассов, так как ваш пример был связан с фиксированными значениями, и вы можете предоставить другое сопоставление для 'ДоступногоQuantity' в подклассах, так почему же это недостаточно хорошо? – user2586804

Смежные вопросы