Složitá dědičnost typů v OData v4 s webovým rozhraním API ASP.NET
od Microsoftu
Podle specifikace OData v4 může komplexní typ dědit z jiného komplexního typu. ( Složitý typ je strukturovaný typ bez klíče.) Webové rozhraní API OData 5.3 podporuje dědičnost složitých typů.
Toto téma ukazuje, jak vytvořit model dat entit (EDM) se složitými typy dědičnosti.
Verze softwaru použité v tomto kurzu
- Webové rozhraní API OData 5.3
- OData v4
Hierarchie modelů
K ilustraci dědičnosti složitých typů použijeme následující hierarchii tříd.
Shape
je abstraktní komplexní typ. Rectangle
, Triangle
a Circle
jsou komplexní typy odvozené z Shape
a RoundRectangle
odvozené z Rectangle
. Window
je typ entity a obsahuje Shape
instanci.
Tady jsou třídy CLR, které definují tyto typy.
public class Window
{
public int Id { get; set; }
public string Title { get; set; }
public Shape Shape { get; set; }
}
public abstract class Shape
{
public bool HasBorder { get; set; }
public Color Color { get; set; }
}
public class Rectangle : Shape
{
public Point LeftTop { get; set; }
public int Height { get; set; }
public int Weight { get; set; }
}
public class RoundRectangle : Rectangle
{
public double Round { get; set; }
}
public class Triangle : Shape
{
public Point P1 { get; set; }
public Point P2 { get; set; }
public Point P3 { get; set; }
}
public class Circle : Shape
{
public Point Center { get; set; }
public int Radius { get; set; }
}
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
public enum Color
{
Red,
Blue,
Green,
Yellow
}
Sestavení modelu EDM
K vytvoření EDM můžete použít ODataConventionModelBuilder, který odvodí vztahy dědičnosti z typů CLR.
private IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Window>("Windows");
return builder.GetEdmModel();
}
EDM můžete také sestavit explicitně pomocí ODataModelBuilder. To vyžaduje více kódu, ale poskytuje větší kontrolu nad EDM.
private IEdmModel GetExplicitEdmModel()
{
ODataModelBuilder builder = new ODataModelBuilder();
EnumTypeConfiguration<Color> color = builder.EnumType<Color>();
color.Member(Color.Red);
color.Member(Color.Blue);
color.Member(Color.Green);
color.Member(Color.Yellow);
ComplexTypeConfiguration<Point> point = builder.ComplexType<Point>();
point.Property(c => c.X);
point.Property(c => c.Y);
ComplexTypeConfiguration<Shape> shape = builder.ComplexType<Shape>();
shape.EnumProperty(c => c.Color);
shape.Property(c => c.HasBorder);
shape.Abstract();
ComplexTypeConfiguration<Triangle> triangle = builder.ComplexType<Triangle>();
triangle.ComplexProperty(c => c.P1);
triangle.ComplexProperty(c => c.P2);
triangle.ComplexProperty(c => c.P2);
triangle.DerivesFrom<Shape>();
ComplexTypeConfiguration<Rectangle> rectangle = builder.ComplexType<Rectangle>();
rectangle.ComplexProperty(c => c.LeftTop);
rectangle.Property(c => c.Height);
rectangle.Property(c => c.Weight);
rectangle.DerivesFrom<Shape>();
ComplexTypeConfiguration<RoundRectangle> roundRectangle = builder.ComplexType<RoundRectangle>();
roundRectangle.Property(c => c.Round);
roundRectangle.DerivesFrom<Rectangle>();
ComplexTypeConfiguration<Circle> circle = builder.ComplexType<Circle>();
circle.ComplexProperty(c => c.Center);
circle.Property(c => c.Radius);
circle.DerivesFrom<Shape>();
EntityTypeConfiguration<Window> window = builder.EntityType<Window>();
window.HasKey(c => c.Id);
window.Property(c => c.Title);
window.ComplexProperty(c => c.Shape);
builder.EntitySet<Window>("Windows");
return builder.GetEdmModel();
}
Tyto dva příklady vytvoří stejné schéma EDM.
Dokument metadat
Tady je dokument metadat OData, který zobrazuje dědičnost složitých typů.
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="NS" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Window">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false" />
<Property Name="Title" Type="Edm.String" />
<Property Name="Shape" Type="BookStore.Shape" />
</EntityType>
<ComplexType Name="Shape" Abstract="true">
<Property Name="HasBorder" Type="Edm.Boolean" Nullable="false" />
<Property Name="Color" Type="BookStore.Color" Nullable="false" />
</ComplexType>
<ComplexType Name="Circle" BaseType="BookStore.Shape">
<Property Name="Center" Type="BookStore.Point" />
<Property Name="Radius" Type="Edm.Int32" Nullable="false" />
</ComplexType>
<ComplexType Name="Point">
<Property Name="X" Type="Edm.Int32" Nullable="false" />
<Property Name="Y" Type="Edm.Int32" Nullable="false" />
</ComplexType>
<ComplexType Name="Rectangle" BaseType="BookStore.Shape">
<Property Name="LeftTop" Type="BookStore.Point" />
<Property Name="Height" Type="Edm.Int32" Nullable="false" />
<Property Name="Weight" Type="Edm.Int32" Nullable="false" />
</ComplexType>
<ComplexType Name="RoundRectangle" BaseType="BookStore.Rectangle">
<Property Name="Round" Type="Edm.Double" Nullable="false" />
</ComplexType>
<ComplexType Name="Triangle" BaseType="BookStore.Shape">
<Property Name="P1" Type="BookStore.Point" />
<Property Name="P2" Type="BookStore.Point" />
<Property Name="P3" Type="BookStore.Point" />
</ComplexType>
<EnumType Name="Color">
<Member Name="Red" Value="0" />
<Member Name="Blue" Value="1" />
<Member Name="Green" Value="2" />
<Member Name="Yellow" Value="3" />
</EnumType>
</Schema>
<Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityContainer Name="Container">
<EntitySet Name="Windows" EntityType="BookStore.Window" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Z dokumentu metadat vidíte, že:
- Komplexní
Shape
typ je abstraktní. - Komplexní
Rectangle
typ ,Triangle
aCircle
mají základní typShape
. - Typ
RoundRectangle
má základní typRectangle
.
Přetypování komplexních typů
Nyní se podporuje přetypování u složitých typů. Například následující dotaz přetypuje objekt Shape
na Rectangle
.
GET ~/odata/Windows(1)/Shape/NS.Rectangle/LeftTop
Tady je datová část odpovědi:
{
"@odata.context":"http://localhost/odata/$metadata#Windows(1)/Shape/NS.Rectangle/LeftTop",
"X":100,"Y":100
}
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro