代码之家  ›  专栏  ›  技术社区  ›  AaronLS

如何与实体框架数据模型设计器进行简单联接?

  •  1
  • AaronLS  · 技术社区  · 15 年前

    我试过这个: http://channel9.msdn.com/posts/RobBagby/deCast-Entity-Framework-Modeling-Implementing-Entity-Splitting/Default.aspx?wa=wsignin1.0

    …使用codeplex的Northwind示例数据库,使用Employee和Contact表。我想创建一个EmployeeContact实体,它基本上从联系人中提取firstname和lastname列。所以我复制并粘贴了这些属性和contactid属性,从联系人实体到员工实体。我映射了所有这些内容,但现在在映射EmployeeID属性时出错:

    “错误3024:从第389行开始的映射片段出现问题:必须为EntitySet员工的所有键属性(Employees.EmployeeID)指定映射。”

    就这点而言,如何让vs显示映射文件的标记而不是显示设计器?至少在那时我可以开始看到错误的来源,因为它引用了一个特定的行号。

    此属性是映射的,因为“映射详细信息”视图显示了从表列到同名实体属性的分配,而该分配已经以这种方式为我生成。我花了很长时间才说到这一点,而创建一个通常是简单连接的连接是如此有问题,这让我很沮丧。我不想想象一个人在做任何更复杂的事情时遇到的问题。

    我相信有人会建议我使用LINQ,但我认为实体框架的全部目的是实现它,所以您考虑的更多是数据的意义,而不是关系结构?换句话说,每次需要一组简单的数据时,不必进行大量的连接。

    事先谢谢。

    这是我的edmx文件,我已经剥离了mappings部分,尝试让它编译:

    <?xml version="1.0" encoding="utf-8"?>
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
      <!-- EF Runtime content -->
      <edmx:Runtime>
        <!-- SSDL content -->
        <edmx:StorageModels>
          <Schema Namespace="AdventureWorksModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
            <EntityContainer Name="AdventureWorksModelStoreContainer">
              <EntitySet Name="Employee" EntityType="AdventureWorksModel.Store.Employee" store:Type="Tables" Schema="HumanResources" />
              <EntitySet Name="Contact" EntityType="AdventureWorksModel.Store.Contact" Schema="Person" store:Type="Tables" />
              <AssociationSet Name="FK_Employee_Contact_ContactID" Association="AdventureWorksModel.Store.FK_Employee_Contact_ContactID">
                <End EntitySet="Contact" Role="Contact" />
                <End EntitySet="Employee" Role="Employee" />
              </AssociationSet>
              <AssociationSet Name="FK_Employee_Employee_ManagerID" Association="AdventureWorksModel.Store.FK_Employee_Employee_ManagerID">
                <End Role="Employee" EntitySet="Employee" />
                <End Role="Employee1" EntitySet="Employee" />
              </AssociationSet>
            </EntityContainer>
            <EntityType Name="Employee">
              <Key>
                <PropertyRef Name="EmployeeID" />
              </Key>
              <Property Name="EmployeeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="NationalIDNumber" Type="nvarchar" Nullable="false" MaxLength="15" />
              <Property Name="ContactID" Type="int" Nullable="false" />
              <Property Name="LoginID" Type="nvarchar" Nullable="false" MaxLength="256" />
              <Property Name="ManagerID" Type="int" />
              <Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />
              <Property Name="BirthDate" Type="datetime" Nullable="false" />
              <Property Name="MaritalStatus" Type="nchar" Nullable="false" MaxLength="1" />
              <Property Name="Gender" Type="nchar" Nullable="false" MaxLength="1" />
              <Property Name="HireDate" Type="datetime" Nullable="false" />
              <Property Name="SalariedFlag" Type="bit" Nullable="false" />
              <Property Name="VacationHours" Type="smallint" Nullable="false" />
              <Property Name="SickLeaveHours" Type="smallint" Nullable="false" />
              <Property Name="CurrentFlag" Type="bit" Nullable="false" />
              <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
              <Property Name="ModifiedDate" Type="datetime" Nullable="false" />
            </EntityType>
            <EntityType Name="Contact">
              <Key>
                <PropertyRef Name="ContactID" />
              </Key>
              <Property StoreGeneratedPattern="Identity" Name="ContactID" Nullable="false" Type="int" />
              <Property Name="NameStyle" Nullable="false" Type="bit" />
              <Property Name="Title" MaxLength="8" Type="nvarchar" />
              <Property Name="FirstName" Nullable="false" MaxLength="50" Type="nvarchar" />
              <Property Name="MiddleName" MaxLength="50" Type="nvarchar" />
              <Property Name="LastName" Nullable="false" MaxLength="50" Type="nvarchar" />
              <Property Name="Suffix" MaxLength="10" Type="nvarchar" />
              <Property Name="EmailAddress" MaxLength="50" Type="nvarchar" />
              <Property Name="EmailPromotion" Nullable="false" Type="int" />
              <Property Name="Phone" MaxLength="25" Type="nvarchar" />
              <Property Name="PasswordHash" Nullable="false" MaxLength="128" Type="varchar" />
              <Property Name="PasswordSalt" Nullable="false" MaxLength="10" Type="varchar" />
              <Property Name="AdditionalContactInfo" Type="xml" />
              <Property Name="rowguid" Nullable="false" Type="uniqueidentifier" />
              <Property Name="ModifiedDate" Nullable="false" Type="datetime" />
            </EntityType>
            <Association Name="FK_Employee_Contact_ContactID">
              <End Type="AdventureWorksModel.Store.Contact" Multiplicity="1" Role="Contact" />
              <End Type="AdventureWorksModel.Store.Employee" Multiplicity="*" Role="Employee" />
              <ReferentialConstraint>
                <Principal Role="Contact">
                  <PropertyRef Name="ContactID" />
                </Principal>
                <Dependent Role="Employee">
                  <PropertyRef Name="ContactID" />
                </Dependent>
              </ReferentialConstraint>
            </Association>
            <Association Name="FK_Employee_Employee_ManagerID">
              <End Role="Employee" Type="AdventureWorksModel.Store.Employee" Multiplicity="0..1" />
              <End Role="Employee1" Type="AdventureWorksModel.Store.Employee" Multiplicity="*" />
              <ReferentialConstraint>
                <Principal Role="Employee">
                  <PropertyRef Name="EmployeeID" />
                </Principal>
                <Dependent Role="Employee1">
                  <PropertyRef Name="ManagerID" />
                </Dependent>
              </ReferentialConstraint>
            </Association>
          </Schema>
        </edmx:StorageModels>
        <!-- CSDL content -->
        <edmx:ConceptualModels>
          <Schema Namespace="AdventureWorksModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
            <EntityContainer Name="AdventureWorksEntities">
              <EntitySet Name="EmployeeContacts" EntityType="AdventureWorksModel.EmployeeContact" />
              </EntityContainer>
            <EntityType Name="EmployeeContact">
              <Key>
                <PropertyRef Name="ContactID" />            
              </Key>
              <Property Name="EmployeeID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Name="NationalIDNumber" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
              <Property Name="LoginID" Type="String" Nullable="false" MaxLength="256" Unicode="true" FixedLength="false" />
              <Property Name="Title" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
              <Property Name="BirthDate" Type="DateTime" Nullable="false" />
              <Property Name="MaritalStatus" Type="String" Nullable="false" MaxLength="1" Unicode="true" FixedLength="true" />
              <Property Name="Gender" Type="String" Nullable="false" MaxLength="1" Unicode="true" FixedLength="true" />
              <Property Name="HireDate" Type="DateTime" Nullable="false" />
              <Property Name="SalariedFlag" Type="Boolean" Nullable="false" />
              <Property Name="VacationHours" Type="Int16" Nullable="false" />
              <Property Name="SickLeaveHours" Type="Int16" Nullable="false" />
              <Property Name="CurrentFlag" Type="Boolean" Nullable="false" />
              <Property Name="rowguid" Type="Guid" Nullable="false" />
              <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
              <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
              <Property Type="String" Name="MiddleName" MaxLength="50" FixedLength="false" Unicode="true" />
              <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" />
              <Property Type="Int32" Name="ContactID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
            </EntityType>
          </Schema>
        </edmx:ConceptualModels>
        <!-- C-S mapping content -->
        <edmx:Mappings>
          <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
            <EntityContainerMapping StorageEntityContainer="AdventureWorksModelStoreContainer" CdmEntityContainer="AdventureWorksEntities">
              <EntitySetMapping Name="EmployeeContacts">            
                <EntityTypeMapping TypeName="IsTypeOf(AdventureWorksModel.EmployeeContact)">              
                  <MappingFragment StoreEntitySet="Employee">
                    <Condition ColumnName="ContactID" IsNull="false"/>                
                    <ScalarProperty Name="ContactID" ColumnName="ContactID"/>
                    </MappingFragment>
                  <MappingFragment StoreEntitySet="Contact">
                    <ScalarProperty Name="ContactID" ColumnName="ContactID"/>
                    </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/2007/06/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="False" />
          </DesignerInfoPropertySet>
        </Options>
        <!-- Diagram content (shape and connector positions) -->
        <Diagrams>
          <Diagram Name="Model1" ZoomLevel="70">
            <EntityTypeShape EntityType="AdventureWorksModel.EmployeeContact" Width="1.5" PointX="3.25" PointY="0.5" Height="4.480205078125" IsExpanded="true" />
            </Diagram></Diagrams>
      </Designer>
    </edmx:Edmx>
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   AaronLS    15 年前

    我有点放弃了这一点,意识到它似乎不是有意这样使用的。相反,我只需要遍历导航属性就可以了,这就像进行一个连接一样,只是采用了一种更简单的OO方式。