Extend model with additional property (Angular)
This guide demonstrates how to extend model with additional property.
Quick video
You can extend your table class with additional, not-mapped properties. For example you can add ExtendedPrice to Northwind OrderDetails (SQL Table) from OrderDetailsExtended (SQL View) using partial classes:
1. Add Northwind OrderDetails partial class with ExtendedPrice property
OrderDetail.Custom.cs
public partial class OrderDetail
{
// Additional property
[NotMapped]
public decimal? ExtendedPrice
{
get;
set;
}
}
OrderDetail.Custom.vb
Public Partial Class OrderDetail
<NotMapped>
Public Property ExtendedPrice As Decimal?
End Class
2. Populate ExtendedPrice from OrderDetailsExtended using OnOrderDetailsRead
partial method in OrderDetailsController
partial class
OrderDetailsController.Custom.cs
public partial class OrderDetailsController
{
partial void OnOrderDetailsRead(ref IQueryable<Models.Northwind.OrderDetail> items)
{
var orderDetailsExtended = this.context.OrderDetailsExtendeds.ToList();
// Populate additional property
foreach (var item in items)
{
var orderDetailExtended = orderDetailsExtended
.Where(ode => ode.OrderID == item.OrderID && ode.ProductID == item.ProductID)
.FirstOrDefault();
if (orderDetailExtended != null)
{
item.ExtendedPrice = orderDetailExtended.ExtendedPrice;
}
}
}
}
OrderDetailsController.Custom.vb
Public Partial Class OrderDetailsController
Private Partial Sub OnOrderDetailsRead(ByRef items As IQueryable(Of Models.Northwind.OrderDetail))
Dim orderDetailsExtended = Me.context.OrderDetailsExtendeds.ToList()
For Each item In items
Dim orderDetailExtended = orderDetailsExtended.Where(Function(ode) ode.OrderID Is item.OrderID AndAlso ode.ProductID Is item.ProductID).FirstOrDefault()
If orderDetailExtended IsNot Nothing Then
item.ExtendedPrice = orderDetailExtended.ExtendedPrice
End If
Next
End Sub
End Class
3. Add NorthwindContext
partial class and define composite key for OrderDetailsExtended
using OnOrderDetailsRead
partial method to hint Entity Framework how to return unique data from SQL View
NorthwindContext.Custom.cs
public partial class NorthwindContext
{
partial void OnModelBuilding(ModelBuilder builder)
{
builder.Entity<DataContextAdditionalConfiguration.Models.Northwind.OrderDetailsExtended>().HasKey(table => new
{
table.OrderID,
table.ProductID
});
}
}
NorthwindContext.Custom.vb
Public Partial Class NorthwindContext
Private Partial Sub OnModelBuilding(ByVal builder As ModelBuilder)
builder.Entity(Of DataContextAdditionalConfiguration.Models.Northwind.OrderDetailsExtended)().HasKey(Function(table) New With {table.OrderID, table.ProductID
})
End Sub
End Class
4. Expose ExtendedPrice to OData using OnConfigureOData
partial method in Startup
partial class
Startup.Custom.cs
public partial class Startup
{
partial void OnConfigureOData(ODataConventionModelBuilder builder)
{
// Expose additional property
var orderDetail = builder.EntitySet<ExtendAdditionalProperty.Models.Northwind.OrderDetail>("OrderDetails");
orderDetail.EntityType.Property(od => od.ExtendedPrice);
}
}
Startup.Custom.vb
Public Partial Class Startup
Private Partial Sub OnConfigureOData(ByVal builder As ODataConventionModelBuilder)
Dim orderDetail = builder.EntitySet(Of ExtendAdditionalProperty.Models.Northwind.OrderDetail)("OrderDetails")
orderDetail.EntityType.[Property](Function(od) od.ExtendedPrice)
End Sub
End Class
5. Create new page, bind DataGrid component to Northwind OrderDetails and add additional column bound to ExtendedPrice property (not available in intellisense)
6. Run the application