如何:通过每种类型多个实体集定义模型(实体框架)
实体数据模型 (EDM) 允许在单个实体容器中的多个实体集中包含实体类型,或在多个实体容器中的实体集中包含实体类型。通过定义每种类型多个实体集 (MEST),当数据库具有分区或其他此类情况(其中,多个表具有相同结构)时,用户可以简化其代码。有关更多信息,请参见实体集 (EDM)。
为 MEST 数据模型实现概念架构
创建类库项目并添加新的 EDM 模板。
实现一个 Customer 实体类型,此类型包含在东部区域 CustomersEast 和西部区域 CustomersWest 中的两个客户实体集中。
请注意这两个区域客户实体集中使用的单个 Customer 实体类型与两个订单类型(即 OrderEast 和 OrderWest,分别位于 OrdersEast 和 OrdersWest 实体集中)之间的差别。
在单个 Customer 类型与两个区域订单类型(OrderEast 和 OrderWest)之间实现关联,以反映 MEST 结构。Customer 类型与区域订单类型之间的这两个关联在基数为 1 的关联端指定 Customer。
在概念架构定义语言 (CSDL) 架构中实现两个包含 Customer 类型的实体集。实体集 CustomersEast 和实体集 CustomersWest 都指定 RegionalCustomersModel.Customer 作为其实体类型。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="RegionalCustomersModel"
Alias="Self"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="RegionalCustomersEntities">
<EntitySet Name="CustomersEast"
EntityType="RegionalCustomersModel.Customer" />
<EntitySet Name="CustomersWest"
EntityType="RegionalCustomersModel.Customer" />
<EntitySet Name="OrdersEast"
EntityType="RegionalCustomersModel.OrderEast" />
<EntitySet Name="OrdersWest"
EntityType="RegionalCustomersModel.OrderWest" />
<AssociationSet Name="FK_OrderEast_Customer"
Association="RegionalCustomersModel.FK_OrderEast_Customer">
<End Role="Customer" EntitySet="CustomersEast" />
<End Role="OrderEast" EntitySet="OrdersEast" />
</AssociationSet>
<AssociationSet Name="FK_OrderWest_Customer"
Association="RegionalCustomersModel.FK_OrderWest_Customer">
<End Role="Customer" EntitySet="CustomersWest" />
<End Role="OrderWest" EntitySet="OrdersWest" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String" Nullable="false" />
<Property Name="TotalPurchases" Type="Decimal" Nullable="false" />
<NavigationProperty Name="OrdersEast"
Relationship="RegionalCustomersModel.FK_OrderEast_Customer"
FromRole="Customer" ToRole="OrderEast" />
<NavigationProperty Name="OrdersWest"
Relationship="RegionalCustomersModel.FK_OrderWest_Customer"
FromRole="Customer" ToRole="OrderWest" />
</EntityType>
<EntityType Name="OrderEast">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="Int32" Nullable="false" />
<Property Name="OrderTotal"
Type="Decimal" Nullable="false" />
<Property Name="Tax" Type="Decimal" />
<NavigationProperty Name="Customer"
Relationship="RegionalCustomersModel.FK_OrderEast_Customer"
FromRole="OrderEast" ToRole="Customer" />
</EntityType>
<EntityType Name="OrderWest">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="Int32" Nullable="false" />
<Property Name="OrderTotal" Type="Decimal" Nullable="false" />
<Property Name="Tax" Type="Decimal" />
<NavigationProperty Name="Customer"
Relationship="RegionalCustomersModel.FK_OrderWest_Customer"
FromRole="OrderWest" ToRole="Customer" />
</EntityType>
<Association Name="FK_OrderEast_Customer">
<End Role="Customer"
Type="RegionalCustomersModel.Customer" Multiplicity="1" />
<End Role="OrderEast"
Type="RegionalCustomersModel.OrderEast" Multiplicity="*" />
</Association>
<Association Name="FK_OrderWest_Customer">
<End Role="Customer"
Type="RegionalCustomersModel.Customer" Multiplicity="1" />
<End Role="OrderWest"
Type="RegionalCustomersModel.OrderWest" Multiplicity="*" />
</Association>
</Schema>
为 MEST 数据模型实现存储架构
分别针对用于 CustomerEast 和 CustomerWest 的表实现相应的实体类型。
请注意,在存储架构中具有两个客户表,这一点与概念架构中只有单个 Customer 实体类型不同。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="RegionalCustomersModel.Store"
Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="CustomerEast"
EntityType="RegionalCustomersModel.Store.CustomerEast" />
<EntitySet Name="CustomerWest"
EntityType="RegionalCustomersModel.Store.CustomerWest" />
<EntitySet Name="OrderEast"
EntityType="RegionalCustomersModel.Store.OrderEast" />
<EntitySet Name="OrderWest"
EntityType="RegionalCustomersModel.Store.OrderWest" />
<AssociationSet Name="FK_OrderEast_CustomerEast"
Association="RegionalCustomersModel.Store.FK_OrderEast_CustomerEast">
<End Role="CustomerEast" EntitySet="CustomerEast" />
<End Role="OrderEast" EntitySet="OrderEast" />
</AssociationSet>
<AssociationSet Name="FK_OrderWest_CustomerWest"
Association="RegionalCustomersModel.Store.FK_OrderWest_CustomerWest">
<End Role="CustomerWest" EntitySet="CustomerWest" />
<End Role="OrderWest" EntitySet="OrderWest" />
</AssociationSet>
</EntityContainer>
<EntityType Name="CustomerEast">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar"
Nullable="false" MaxLength="50" />
<Property Name="TotalPurchases" Type="money" Nullable="false" />
</EntityType>
<EntityType Name="CustomerWest">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar"
Nullable="false" MaxLength="50" />
<Property Name="TotalPurchases" Type="money" Nullable="false" />
</EntityType>
<EntityType Name="OrderEast">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="int" Nullable="false" />
<Property Name="CustomerId" Type="int" Nullable="false" />
<Property Name="OrderTotal" Type="money" Nullable="false" />
<Property Name="Tax" Type="money" />
</EntityType>
<EntityType Name="OrderWest">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="int" Nullable="false" />
<Property Name="CustomerId" Type="int" Nullable="false" />
<Property Name="OrderTotal" Type="money" Nullable="false" />
<Property Name="Tax" Type="money" />
</EntityType>
<Association Name="FK_OrderEast_CustomerEast">
<End Role="CustomerEast"
Type="RegionalCustomersModel.Store.CustomerEast" Multiplicity="1" />
<End Role="OrderEast" Type="RegionalCustomersModel.Store.OrderEast"
Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="CustomerEast">
<PropertyRef Name="CustomerId" />
</Principal>
<Dependent Role="OrderEast">
<PropertyRef Name="CustomerId" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_OrderWest_CustomerWest">
<End Role="CustomerWest"
Type="RegionalCustomersModel.Store.CustomerWest"
Multiplicity="1" />
<End Role="OrderWest"
Type="RegionalCustomersModel.Store.OrderWest"
Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="CustomerWest">
<PropertyRef Name="CustomerId" />
</Principal>
<Dependent Role="OrderWest">
<PropertyRef Name="CustomerId" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
使用 SQL Server Management Studio 生成数据库
在 SQL Server Management Studio 中使用以下脚本生成在本示例和示例如何:通过每种类型一个表继承以定义模型(实体框架) 中使用的数据库。
指向**“文件”菜单上的“新建”,然后单击“数据库引擎查询”**以使用 SQL Server Management Studio 创建 SchoolData 数据库和架构。
在**“连接到数据库引擎”**对话框中键入
localhost
或其他 SQL Server 实例的名称,然后单击“连接”。将以下 Transact-SQL 脚本粘贴到查询窗口中,然后单击**“执行”**。
USE [master]
GO
CREATE DATABASE [RegionalCustomersMEST]
GO
USE [RegionalCustomersMEST]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CustomerWest]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[CustomerWest](
[CustomerId] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[TotalPurchases] [money] NOT NULL,
CONSTRAINT [PK_CustomerWest] PRIMARY KEY CLUSTERED
(
[CustomerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CustomerEast]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[CustomerEast](
[CustomerId] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[TotalPurchases] [money] NOT NULL,
CONSTRAINT [PK_CustomerEast] PRIMARY KEY CLUSTERED
(
[CustomerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrderWest]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[OrderWest](
[OrderId] [int] NOT NULL,
[CustomerId] [int] NOT NULL,
[OrderTotal] [money] NOT NULL,
[Tax] [money] NULL,
CONSTRAINT [PK_OrderWest] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrderEast]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[OrderEast](
[OrderId] [int] NOT NULL,
[CustomerId] [int] NOT NULL,
[OrderTotal] [money] NOT NULL,
[Tax] [money] NULL,
CONSTRAINT [PK_OrderEast] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OrderWest_CustomerWest]') AND parent_object_id = OBJECT_ID(N'[dbo].[OrderWest]'))
ALTER TABLE [dbo].[OrderWest] WITH CHECK ADD CONSTRAINT [FK_OrderWest_CustomerWest] FOREIGN KEY([CustomerId])
REFERENCES [dbo].[CustomerWest] ([CustomerId])
GO
ALTER TABLE [dbo].[OrderWest] CHECK CONSTRAINT [FK_OrderWest_CustomerWest]
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OrderEast_CustomerEast]') AND parent_object_id = OBJECT_ID(N'[dbo].[OrderEast]'))
ALTER TABLE [dbo].[OrderEast] WITH CHECK ADD CONSTRAINT [FK_OrderEast_CustomerEast] FOREIGN KEY([CustomerId])
REFERENCES [dbo].[CustomerEast] ([CustomerId])
GO
ALTER TABLE [dbo].[OrderEast] CHECK CONSTRAINT [FK_OrderEast_CustomerEast]
为 MEST 数据模型实现映射规范
将单个 Customer 实体分别映射到对应于 CustomerEast 和 CustomerWest 的表,如下所示。
请注意,在实体容器映射中,CustomersEast 和 CustomersWest 分别对应于单独的实体集。
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping
StorageEntityContainer="dbo"
CdmEntityContainer="RegionalCustomersEntities">
<EntitySetMapping Name="CustomersEast">
<EntityTypeMapping TypeName="RegionalCustomersModel.Customer">
<MappingFragment StoreEntitySet="CustomerEast">
<ScalarProperty Name="CustomerId" ColumnName="CustomerId" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="TotalPurchases"
ColumnName="TotalPurchases" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="CustomersWest">
<EntityTypeMapping TypeName="RegionalCustomersModel.Customer">
<MappingFragment StoreEntitySet="CustomerWest">
<ScalarProperty Name="CustomerId" ColumnName="CustomerId" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="TotalPurchases"
ColumnName="TotalPurchases" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="OrdersEast" StoreEntitySet="OrderEast"
TypeName="RegionalCustomersModel.OrderEast">
<ScalarProperty Name="OrderId" ColumnName="OrderId" />
<ScalarProperty Name="OrderTotal" ColumnName="OrderTotal" />
<ScalarProperty Name="Tax" ColumnName="Tax" />
</EntitySetMapping>
<EntitySetMapping Name="OrdersWest" StoreEntitySet="OrderWest"
TypeName="RegionalCustomersModel.OrderWest">
<ScalarProperty Name="OrderId" ColumnName="OrderId" />
<ScalarProperty Name="OrderTotal" ColumnName="OrderTotal" />
<ScalarProperty Name="Tax" ColumnName="Tax" />
</EntitySetMapping>
<AssociationSetMapping Name="FK_OrderEast_Customer"
TypeName="RegionalCustomersModel.FK_OrderEast_Customer"
StoreEntitySet="OrderEast">
<EndProperty Name="Customer">
<ScalarProperty Name="CustomerId" ColumnName="CustomerId" />
</EndProperty>
<EndProperty Name="OrderEast">
<ScalarProperty Name="OrderId" ColumnName="OrderId" />
</EndProperty>
<Condition ColumnName="CustomerId" IsNull="false" />
</AssociationSetMapping>
<AssociationSetMapping Name="FK_OrderWest_Customer"
TypeName="RegionalCustomersModel.FK_OrderWest_Customer"
StoreEntitySet="OrderWest">
<EndProperty Name="Customer">
<ScalarProperty Name="CustomerId" ColumnName="CustomerId" />
</EndProperty>
<EndProperty Name="OrderWest">
<ScalarProperty Name="OrderId" ColumnName="OrderId" />
</EndProperty>
<Condition ColumnName="CustomerId" IsNull="false" />
</AssociationSetMapping>
</EntityContainerMapping>
</Mapping>