Multiple-Entity-Sets-per-Type でモデルを定義する方法 (Entity Framework)
Entity Data Model (EDM) では、単一のエンティティ コンテナ内で複数のエンティティ セットに 1 つのエンティティ型を含めることも、複数のエンティティ コンテナ内で複数のエンティティ セットに 1 つのエンティティ型を含めることもできます。型ごとに複数のエンティティ セットを定義できる Multiple-Entity-Sets-per-Type (MEST) の機能により、ユーザーは、データベースがパーティション分割されているなど、複数のテーブルが同じ構造を共有しているようなシナリオで、コーディングを省力化できます。詳細については、「エンティティ セット (EDM)」を参照してください。
MEST データ モデルの概念スキーマを実装するには
クラス ライブラリ プロジェクトを作成し、新しい EDM テンプレートを追加します。
東部地域の顧客 (CustomersEast) と西部地域の顧客 (CustomersWest) の 2 つのエンティティ セットに含まれる Customer エンティティ型を実装します。
2 つの地域の顧客エンティティ セットには単一の Customer エンティティ型が使用されているのに対し、OrdersEast エンティティ セットと OrdersWest エンティティ セットには 2 つの注文型 (OrderEast と OrderWest) が使用されている点に注意してください。
MEST の構造を反映するため、単一の Customer 型と、2 地域の注文型 (OrderEast および OrderWest) との間のアソシエーションを実装します。Customer 型と地域別注文型の間のアソシエーションでは、どちらも基数が 1 であるアソシエーションの End に Customer を指定します。
概念スキーマ定義言語 (CSDL) スキーマで、Customer 型を含んだ 2 つのエンティティ セットを実装します。エンティティ セット 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 エンティティ型が 1 つだけだった概念スキーマとは異なり、ストレージ スキーマには 2 つの顧客テーブルが存在する点に注意してください。
<?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 を使用してデータベースを生成するには
この例および「Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)」の例で使用するデータベースを生成するには、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>
参照
処理手順
Multiple-Entity-Sets-per-Type を使用してオブジェクト クエリを作成および実行する方法 (Entity Framework)
オブジェクトを特定のエンティティ セットに追加する方法 (Entity Framework)