У меня два простых представления
Мне нужно создать связь между CustomerOrderView и CustomerView, используя CustomerID.
Я добавил ассоциацию так:
Нет, здесь это, кажется, вызывает у меня проблемы.
Я дважды щелкаю строку ассоциации и пытаюсь добавить новое реляционное ограничение.
Если я выберу CustomerOrderView в качестве принципала, я получу следующее.
Это не сработает, потому что я пытаюсь получить оба идентификатора CustomerID в обоих представлениях для подключения.
Раунд 2 ... Итак, на этот раз я меняю участника на CustomerView, и теперь я вижу, что оба идентификатора CustomerID подключаются. Вот так.
Но если я попытаюсь сохранить файл объекта, я получу следующие ошибки.
»Ошибка 111: Свойства, на которые ссылается основная роль CustomerOrderView, должны быть в точности идентичны ключу EntityType TestModel.CustomerOrderView, на который ссылается основная роль в ограничении отношения для Relationship TestModel.CustomerOrderViewCustomerView. Убедитесь, что все ключевые свойства заданы указана в основной роли ».
AND
« Ошибка 5 Выполняется преобразование: множественность недопустима в роли «CustomerView» в отношении «CustomerOrderViewCustomerView». Допустимые значения множественности для основной роли: «0..1» или '1'. "
AND
«Ошибка 6 Выполняется преобразование: множественность недействительна в роли« CustomerOrderView »в отношении« CustomerOrderViewCustomerView ». Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница множественности зависимой роли должна быть *. "
Итак, как мне соединить представления вместе в структуре сущностей?
Вот edmx для получения дополнительной помощи.
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="TestModel.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">
<!--Errors Found During Generation:
warning 6002: The table/view 'Test.dbo.CustomerOrderView' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.-->
<EntityType Name="CustomerOrderView">
<Key>
<PropertyRef Name="CustomerOrderID" />
</Key>
<Property Name="CustomerOrderID" Type="numeric" Precision="9" Scale="0" Nullable="false" />
<Property Name="OrderStatus" Type="char" MaxLength="1" />
<Property Name="CustomerID" Type="numeric" Precision="6" Scale="0" />
</EntityType>
<!--Errors Found During Generation:
warning 6002: The table/view 'Test.dbo.CustomerView' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.-->
<EntityType Name="CustomerView">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="numeric" Precision="6" Scale="0" Nullable="false" />
<Property Name="CustomerName" Type="varchar" MaxLength="30" />
</EntityType>
<EntityContainer Name="TestModelStoreContainer">
<EntitySet Name="CustomerOrderView" EntityType="Self.CustomerOrderView" store:Type="Views" store:Schema="dbo">
<DefiningQuery>SELECT
[CustomerOrderView].[CustomerOrderID] AS [CustomerOrderID],
[CustomerOrderView].[OrderStatus] AS [OrderStatus],
[CustomerOrderView].[CustomerID] AS [CustomerID]
FROM [dbo].[CustomerOrderView] AS [CustomerOrderView]</DefiningQuery>
</EntitySet>
<EntitySet Name="CustomerView" EntityType="Self.CustomerView" store:Type="Views" store:Schema="dbo">
<DefiningQuery>SELECT
[CustomerView].[CustomerID] AS [CustomerID],
[CustomerView].[CustomerName] AS [CustomerName]
FROM [dbo].[CustomerView] AS [CustomerView]</DefiningQuery>
</EntitySet>
</EntityContainer>
</Schema></edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="TestModel" 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="TestEntities" annotation:LazyLoadingEnabled="true" >
<EntitySet Name="CustomerOrderViews" EntityType="TestModel.CustomerOrderView" />
<EntitySet Name="CustomerViews" EntityType="TestModel.CustomerView" />
<AssociationSet Name="CustomerOrderViewCustomerView" Association="TestModel.CustomerOrderViewCustomerView">
<End Role="CustomerOrderView" EntitySet="CustomerOrderViews" />
<End Role="CustomerView" EntitySet="CustomerViews" />
</AssociationSet>
</EntityContainer>
<EntityType Name="CustomerOrderView">
<Key>
<PropertyRef Name="CustomerOrderID" />
</Key>
<Property Name="CustomerOrderID" Type="Decimal" Nullable="false" Precision="9" Scale="0" />
<Property Name="OrderStatus" Type="String" MaxLength="1" FixedLength="true" Unicode="false" />
<Property Name="CustomerID" Type="Decimal" Precision="6" Scale="0" />
<NavigationProperty Name="CustomerViews" Relationship="TestModel.CustomerOrderViewCustomerView" FromRole="CustomerOrderView" ToRole="CustomerView" />
</EntityType>
<EntityType Name="CustomerView">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="Decimal" Nullable="false" Precision="6" Scale="0" />
<Property Name="CustomerName" Type="String" MaxLength="30" FixedLength="false" Unicode="false" />
<NavigationProperty Name="CustomerOrderView" Relationship="TestModel.CustomerOrderViewCustomerView" FromRole="CustomerView" ToRole="CustomerOrderView" />
</EntityType>
<Association Name="CustomerOrderViewCustomerView">
<End Type="TestModel.CustomerOrderView" Role="CustomerOrderView" Multiplicity="1" />
<End Type="TestModel.CustomerView" Role="CustomerView" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="CustomerView">
<PropertyRef Name="CustomerID" />
</Principal>
<Dependent Role="CustomerOrderView">
<PropertyRef Name="CustomerID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="TestModelStoreContainer" CdmEntityContainer="TestEntities" >
<EntitySetMapping Name="CustomerOrderViews">
<EntityTypeMapping TypeName="TestModel.CustomerOrderView">
<MappingFragment StoreEntitySet="CustomerOrderView">
<ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
<ScalarProperty Name="OrderStatus" ColumnName="OrderStatus" />
<ScalarProperty Name="CustomerOrderID" ColumnName="CustomerOrderID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="CustomerViews">
<EntityTypeMapping TypeName="TestModel.CustomerView">
<MappingFragment StoreEntitySet="CustomerView">
<ScalarProperty Name="CustomerName" ColumnName="CustomerName" />
<ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
<Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</Connection>
<Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
<DesignerProperty Name="EnablePluralization" Value="true" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
<DesignerProperty Name="UseLegacyProvider" Value="false" />
<DesignerProperty Name="CodeGenerationStrategy" Value="None" />
</DesignerInfoPropertySet>
</Options>
<!-- Diagram content (shape and connector positions) -->
<Diagrams></Diagrams>
</Designer>
</edmx:Edmx>
РЕДАКТИРОВАТЬ - Дополнительные примеры
Я поменял местами 1 на многие, так что «1» CustomerView может иметь «Многие» CustomerOrderView.
Теперь я получаю следующие ошибки:
«Ошибка 4 Ошибка 3031: Проблема при сопоставлении фрагментов, начинающихся со строки 90: Столбец, не допускающий значения NULL, CustomerOrderView.CustomerID в таблице CustomerOrderView сопоставлен со свойством сущности, допускающим значение NULL». -- Это неправда. CustomerOrderView.CustomerID допускает значение NULL, но CustomerView.CustomerID не допускает значения NULL.
AND
«Ошибка 5 Выполняется преобразование: множественность недопустима в роли« CustomerView »в отношении« CustomerViewCustomerOrderView ». Поскольку все свойства в зависимой роли допускают значение NULL, кратность основной роли должна быть равна 0 .. 1 '. "
Затем я изменил CustomerOrderView.CustomerID на не допускающий значение NULL, хотя на самом деле может быть заказ, еще не назначенный для CustomerID. Но после этого изменения я получаю следующую ошибку во время выполнения.
«Свойству 'CustomerID' в 'CustomerOrderView' не удалось установить значение 'null'. Вы должны установить для этого свойства ненулевое значение типа ' System.Decimal '. "
Итак, я вошел в CustomerOrderView в SQL и добавил ISNULL (CustomerID, -1).
Теперь это работает, НО это то, что я хочу. CustomerOrderView должен иметь возможность иметь значение Nullable.
Мне кажется, что я что-то делаю неправильно или что-то неправильно настроил.
РЕДАКТИРОВАТЬ - с исправлением.
В основном мне нужно было использовать отношение 0..1 ко многим, где 0..1 находится на стороне CustomerOrderView, а многие - на стороне CustomerView. Затем я сказал ему не добавлять свойство внешнего ключа и вручную добавил его с помощью CustomerView в качестве участника и CustomerOrderView в качестве зависимого.