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

EntityFramework映射-此映射有什么问题?

  •  1
  • Greg  · 技术社区  · 14 年前

    我一直在研究下面的实体框架映射哪里出错。我所做的是:

    a)创建了一个sqlite数据库(见下文,注意sqlite不允许fk约束) b)创建空白实体数据模式,然后从数据库创建模型 c)然后,issue正试图添加模型关联,以便它获取并使用我在usages表的数据库中创建的“processnameid”列。我一直在尝试使用GUI表映射窗格来完成这项工作,但它看起来不太直观。

    问题-我收到以下错误:

    Error 3 
    Error 3021: Problem in mapping fragments starting at line 85:
    Each of the following columns in table Usages is mapped to multiple conceptual side properties:
    
    Usages.ProcessNameId is mapped to <ProcessNameUsage.ProcessName.Id,  ProcessNameUsage.Usage.Id>
    Error   4
    Error 3025: Problem in mapping fragments starting at line 85:
    Must specify mapping for all key properties (Usages.Id) of table Usages.
    

    问题-所以问题是我需要对XML做什么更改才能使关联正常工作?

    SQL

    CREATE TABLE "ProcessNames" (
        "Id" INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL , 
        "Name" VARCHAR NOT NULL  UNIQUE
    )
    
    CREATE TABLE "Usages" (
        "Id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , 
        "ProcessNameId" INTEGER NOT NULL , 
        "Amount" INTEGER NOT NULL , 
        "Datetime" DATETIME NOT NULL 
    )
    

    模型配置

    <?xml version="1.0" encoding="utf-8"?>
    <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
      <!-- EF Runtime content -->
      <edmx:Runtime>
        <!-- SSDL content -->
        <edmx:StorageModels>
        <Schema Namespace="Model1.Store" Alias="Self" Provider="System.Data.SQLite" ProviderManifestToken="ISO8601" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
            <EntityContainer Name="Model1StoreContainer">
              <EntitySet Name="ProcessNames" EntityType="Model1.Store.ProcessNames" store:Type="Tables" />
              <EntitySet Name="Usages" EntityType="Model1.Store.Usages" store:Type="Tables" />
            </EntityContainer>
            <EntityType Name="ProcessNames">
              <Key>
                <PropertyRef Name="Id" />
              </Key>
              <Property Name="Id" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="Name" Type="nvarchar" Nullable="false" />
            </EntityType>
            <EntityType Name="Usages">
              <Key>
                <PropertyRef Name="Id" />
              </Key>
              <Property Name="Id" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
              <Property Name="ProcessNameId" Type="integer" Nullable="false" />
              <Property Name="Amount" Type="integer" Nullable="false" />
              <Property Name="Datetime" Type="datetime" Nullable="false" />
            </EntityType>
          </Schema></edmx:StorageModels>
        <!-- CSDL content -->
        <edmx:ConceptualModels>
          <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="Model1" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
            <EntityContainer Name="Model1Container" annotation:LazyLoadingEnabled="true">
              <EntitySet Name="ProcessNames" EntityType="Model1.ProcessName" />
              <EntitySet Name="Usages" EntityType="Model1.Usage" />
              <AssociationSet Name="ProcessNameUsage" Association="Model1.ProcessNameUsage">
                <End Role="ProcessName" EntitySet="ProcessNames" />
                <End Role="Usage" EntitySet="Usages" />
              </AssociationSet>
            </EntityContainer>
            <EntityType Name="ProcessName">
              <Key>
                <PropertyRef Name="Id" />
              </Key>
              <Property Type="Int64" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Type="String" Name="Name" Nullable="false" MaxLength="2147483647" FixedLength="false" Unicode="true" />
              <NavigationProperty Name="Usages" Relationship="Model1.ProcessNameUsage" FromRole="ProcessName" ToRole="Usage" />
            </EntityType>
            <EntityType Name="Usage">
              <Key>
                <PropertyRef Name="Id" />
              </Key>
              <Property Type="Int64" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
              <Property Type="Int64" Name="ProcessNameId" Nullable="false" />
              <Property Type="Int64" Name="Amount" Nullable="false" />
              <Property Type="DateTime" Name="Datetime" Nullable="false" />
              <NavigationProperty Name="ProcessName" Relationship="Model1.ProcessNameUsage" FromRole="Usage" ToRole="ProcessName" />
            </EntityType>
            <Association Name="ProcessNameUsage">
              <End Type="Model1.ProcessName" Role="ProcessName" Multiplicity="1" />
              <End Type="Model1.Usage" Role="Usage" Multiplicity="*" />
            </Association>
          </Schema>
        </edmx:ConceptualModels>
        <!-- C-S mapping content -->
        <edmx:Mappings>
        <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="Model1StoreContainer" CdmEntityContainer="Model1Container">
              <EntitySetMapping Name="ProcessNames">
                <EntityTypeMapping TypeName="Model1.ProcessName">
                  <MappingFragment StoreEntitySet="ProcessNames">
                    <ScalarProperty Name="Name" ColumnName="Name" />
                    <ScalarProperty Name="Id" ColumnName="Id" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
              <EntitySetMapping Name="Usages">
                <EntityTypeMapping TypeName="Model1.Usage">
                  <MappingFragment StoreEntitySet="Usages">
                    <ScalarProperty Name="Datetime" ColumnName="Datetime" />
                    <ScalarProperty Name="Amount" ColumnName="Amount" />
                    <ScalarProperty Name="ProcessNameId" ColumnName="ProcessNameId" />
                    <ScalarProperty Name="Id" ColumnName="Id" />
                  </MappingFragment>
                </EntityTypeMapping>
              </EntitySetMapping>
              <AssociationSetMapping Name="ProcessNameUsage" TypeName="Model1.ProcessNameUsage" StoreEntitySet="Usages">
                <EndProperty Name="ProcessName">
                  <ScalarProperty Name="Id" ColumnName="ProcessNameId" />
                </EndProperty>
                <EndProperty Name="Usage">
                  <ScalarProperty Name="Id" ColumnName="ProcessNameId" />
                </EndProperty>
              </AssociationSetMapping>
            </EntityContainerMapping>
    </Mapping></edmx:Mappings>
      </edmx:Runtime>
      <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
      <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
        <edmx:Connection>
          <DesignerInfoPropertySet>
            <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
          </DesignerInfoPropertySet>
        </edmx:Connection>
        <edmx:Options>
          <DesignerInfoPropertySet>
            <DesignerProperty Name="ValidateOnBuild" Value="true" />
            <DesignerProperty Name="EnablePluralization" Value="True" />
            <DesignerProperty Name="IncludeForeignKeysInModel" Value="False" />
          </DesignerInfoPropertySet>
        </edmx:Options>
        <!-- Diagram content (shape and connector positions) -->
        <edmx:Diagrams>
          <Diagram Name="Model1" >
            <EntityTypeShape EntityType="Model1.ProcessName" Width="1.5" PointX="0.75" PointY="0.75" Height="1.2636116536458317" />
            <EntityTypeShape EntityType="Model1.Usage" Width="1.5" PointX="3" PointY="0.75" Height="1.7566536458333339" />
            <AssociationConnector Association="Model1.ProcessNameUsage">
              <ConnectorPoint PointX="2.25" PointY="1.4639794921875002" />
              <ConnectorPoint PointX="3" PointY="1.4639794921875002" />
            </AssociationConnector>
          </Diagram>
        </edmx:Diagrams>
      </edmx:Designer>
    </edmx:Edmx>
    

    谢谢

    2 回复  |  直到 12 年前
        1
  •  2
  •   Paul Keister    14 年前

    如果要公开外键ID并让EF管理关系,可以使用外键关联,但这些关联仅在EF4.0中可用。

        2
  •  1
  •   Greg    14 年前

    已经解决了。因此,为了在从sqlite数据库导入模型后使其正常工作,我执行了以下操作:

    a)删除导入的“processnameid”列

    b)然后在这之后添加了两个实体之间的关联-它自动使用“processnameid”作为fk id,这与我在数据库中已经拥有的匹配性很好(否则我将不得不对此进行跟踪)。

    之后一切都很顺利。