【问题标题】:How to do a simple join with entity framework data model designer?如何与实体框架数据模型设计器进行简单连接?
【发布时间】:2010-01-12 05:58:11
【问题描述】:

我试过这个: 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 属性从 Contact 实体复制并粘贴到 Employee 实体。我映射了所有这些,但我现在收到有关映射 EmployeeID 属性的错误:

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

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

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

我相信有人会建议我使用 LINQ,但我认为 Entity Framework 的全部目的是让您更多地考虑数据的含义而不是关系结构?换句话说,不必每次想要一组简单的数据时都进行大量连接。

提前致谢。

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

<?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>

【问题讨论】:

  • 您可以让 Visual Studio 显示 edmx 文件的 XML 标记,方法是右键单击文件,选择“打开方式”,然后从“打开方式”对话框中选择“XML 编辑器”。跨度>

标签: .net entity-framework


【解决方案1】:

我有点放弃了这一点,意识到它似乎并不打算以这种方式使用。相反,我将只解决遍历导航属性,这就像做一个连接,除了以更简单的 OO 方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2010-09-28
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多