Ассоциации представлений Entity Framework не работают

У меня два простых представления
Модель

Мне нужно создать связь между CustomerOrderView и CustomerView, используя CustomerID.

Я добавил ассоциацию так:
Association

Нет, здесь это, кажется, вызывает у меня проблемы.
Я дважды щелкаю строку ассоциации и пытаюсь добавить новое реляционное ограничение.
Если я выберу CustomerOrderView в качестве принципала, я получу следующее.
Ограничение CustomerOrderView

Это не сработает, потому что я пытаюсь получить оба идентификатора CustomerID в обоих представлениях для подключения.
Раунд 2 ... Итак, на этот раз я меняю участника на CustomerView, и теперь я вижу, что оба идентификатора CustomerID подключаются. Вот так.
Ограничение CustomerView

Но если я попытаюсь сохранить файл объекта, я получу следующие ошибки.
»Ошибка 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 в качестве зависимого.


person goroth    schedule 27.04.2014    source источник
comment
вам нужно создать отношения между двумя таблицами, которые имеют отношения один ко многим?   -  person Harshana Narangoda    schedule 27.04.2014
comment
Возможно, ты прав. Я удалил ассоциацию и поменял местами «один ко многим», но она все равно не сохранится. Те же ошибки о множественности   -  person goroth    schedule 27.04.2014
comment
Можете ли вы добавить снимок экрана с вашей ошибкой.   -  person Harshana Narangoda    schedule 27.04.2014
comment
Я добавил больше кода в EDIT, чтобы показать больше проблемы.   -  person goroth    schedule 27.04.2014


Ответы (2)


Я думаю, проблема в ваших отношениях (отношения «один ко многим»). Я думаю, что одна сторона должна быть Таблицей просмотра клиентов. Тогда все будет хорошо.

ОБНОВЛЕНО

Обнаружена проблема. Я думаю, что эти два свойства не соответствуют друг другу. вот почему выскакивает ошибка. Убедитесь, что свойство CustomerView.CustomerID, допускающее значение NULL, истинно. если это так, то оно изменится на false, как показано ниже

введите описание изображения здесь

person Harshana Narangoda    schedule 27.04.2014
comment
Я видел это и изменил его с True на False. Я знаю, что CustomerView.CustomerID должен иметь CustomerID Nullable = False, но я не понимаю, почему CustomerOrderView.CustomerID также должен иметь CustomerID Nullable, равный False. Означает ли это, что Entity Framework не поддерживает внешние ключи, допускающие значение NULL? - person goroth; 27.04.2014
comment
Спасибо за вашу помощь. Я бы посоветовал вам удалить свой адрес электронной почты или удалить предыдущий комментарий. В любом случае, вы правы в том, что EF поддерживает значение NULL. Я обновлю свой код выше, чтобы показать окончательное исправление. В основном мне приходилось использовать 0..1 для многих, где 0..1 находится на стороне CustomerOrderView, а многие - на стороне CustomerView. - person goroth; 28.04.2014

Я решил эту проблему, сделав поля таблицы не пустыми, и поэтому представление, которое зависит от этого поля, будет принимать ключи в качестве первичного ключа в Entity Framework.

person Sayed Yousif    schedule 15.03.2019