您可以避免使用DefiningQuery 构造创建数据库视图。 DefiningQuery 提供与数据库视图相同的功能,但它是在您的模型中定义的,而不是在数据库本身中。
您不能使用 Visual Studio 模型设计器创建 DefiningQuery,您应该手动编辑您的 edmx 文件。首先将EntityType和EntitySet定义添加到SSDL层:
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="TestDataModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="ExtendedData">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="nvarchar(max)" Nullable="false" />
<Property Name="HasAdditionalData" Type="bit" Nullable="false" />
</EntityType>
<EntityContainer Name="TestDataModelStoreContainer">
<EntitySet Name="ExtendedData" EntityType="Self.ExtendedData" store:Type="Views" store:Schema="dbo" store:Name="ExtendedData">
<DefiningQuery>
SELECT d.Id, d.Name, CAST(IIF(ad.Id IS NULL, 0, 1) AS BIT) AS HasAdditionalData
FROM Data AS d
LEFT OUTER JOIN AdditionalData AS ad ON d.Id = ad.Id
</DefiningQuery>
</EntitySet>
</EntityContainer>
</Schema></edmx:StorageModels>
请注意,您的 View 查询是在 DefiningQuery 元素下指定的,但略有更改。
然后您应该将ExtendedData 实体添加到 CSDL。这可以通过进一步手动编辑 edmx 或使用模型设计器来完成。这是它最终的样子:
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="TestDataModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityContainer Name="TestDataEntities2" annotation:LazyLoadingEnabled="true">
<EntitySet Name="ExtendedDatas" EntityType="TestDataModel.ExtendedData" />
</EntityContainer>
<EntityType Name="ExtendedData">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int64" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="String" Nullable="false" />
<Property Name="HasAdditionalData" Type="Boolean" Nullable="false" />
</EntityType>
</Schema>
</edmx:ConceptualModels>
然后你应该添加 CSDL-SSDL 映射,再次手动编辑 edmx 或通过 Table Mapping:
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="TestDataModelStoreContainer" CdmEntityContainer="TestDataEntities2">
<EntitySetMapping Name="ExtendedDatas">
<EntityTypeMapping TypeName="IsTypeOf(TestDataModel.ExtendedData)">
<MappingFragment StoreEntitySet="ExtendedData">
<ScalarProperty Name="HasAdditionalData" ColumnName="HasAdditionalData" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Id" ColumnName="Id" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
请注意:如果您从数据库更新模型,则 edmx 的 SSDL 部分中的任何手动更改都将丢失。