2017-02-03 5 views
2

Мои объекты домена используют EF Table Per Type Inheritance, и вот связь.Получить тип объекта в EF TPT Наследование

table per type

Как вы можете видеть счета-фактуры сидит на материнской компании Order.cs. Это создает проблемы, когда я занимаюсь счетами-фактурами.

Например, создать счет-фактуру, мне нужно пройти заказ Id к контроллеру счета-фактуры:

public ActionResult Create(int orderId) 
{ 
    if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

    // determine whether the order is a SaleOrder or a PurchaseOrder 
    // then create the viewModel passing in the SaleOrder/PurchaseOrder details 
    return View(viewModel); 
} 

Как выяснить, какой тип ребенка порядок является просто его Id ?

UPDATE

Тео спросил, как я в настоящее время извлечения SaleOrders и PurchaseOrders. У меня есть это в моем контексте:

public DbSet<PurchaseOrder> PurchaseOrders { get; set; } 
public DbSet<SaleOrder> SaleOrders { get; set; } 

Я построил хранилище вокруг каждого, так что у меня PurchaseOrderRepository и SaleOrderRepository и я делаю CRUD таким образом.

+1

Это будет зависеть от любого количества вещей. Сохраняете ли вы свои SO и PO в одной таблице или разных таблицах? Как вы их действительно получаете? существует ли какое-либо различие между диапазоном идентификаторов, присвоенных типам заказов? Вы не склонны настраивать какой-то механизм управления, который отслеживает, какие идентификаторы были присвоены типу заказа? – Theo

+1

@ Theo, он уже заявил, что это стратегия TPT –

+0

Да, у каждого своя таблица, вот что означает TPT. Но я добавил некоторые другие сведения, которые могут быть полезны. – Ciwan

ответ

1

Если два класса наследуют от того же класса, вы можете создать еще один DbSet

public DbSet<Order> Orders { get; set; } 

и в вашем действии просят порядка, как этот

public ActionResult Create(int orderId) 
    { 
     if (orderId == 0) return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     var order = db.Orders.Find(orderId); 
     if(order is SaleOrder){ 
     //do your stuff for SaleOrder 
     } 
     if(order is PurchaseOrder){ 
     //do your stuff for PurchaseOrder 
     }   
     return View(viewModel); 
    } 
+0

hmm это дало мне идею объединить мои 'SaleOrderRepository' и' PurchaseOrderRepository'! Это тоже можно сделать?Или мне нужны эти отдельные, если я хочу, например, вернуть все PurchaseOrders – Ciwan