的EntityFramework映射 - 什么是错的这种映射?EntityFramework

2023-09-06 23:23:54 作者:一懒众山小.

我工作了,我要去哪里错了下面的实体框架映射的一种坚持。我所做的是:

I'm kind of stuck working out where I'm going wrong with the below entity framework mapping. What I've done is:

一)创建一个SQLite数据库(见下文,指出SQLite不容许FK约束) B)创建了一个空白的实体数据模式和放大器;然后从数据库中创建的模型 三)问题,然后尝试添加的模式关联,以便它拿起,并使用我在USAGES表的数据库中创建的ProcessNameId一栏。我一直在试图使用GUI表映射窗格中要做到这一点,但它似乎并没有太直观。

a) created a Sqlite database (see below, noting Sqlite doesn't allow FK constraints) b) created a blank Entity Data Mode & then created the model from the database c) issue is then trying to add the Model association so it picks up and uses the "ProcessNameId" column I've created in the database in the USAGES table. I've been trying to use the GUI Table Mapping pane to do this but it doesn't seem too intuitive.

问题 - 我收到以下错误:

Issue - I'm getting the following error:

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,我需要做出正确的有协会工作

Question - So the question is what changes to the XML do I need to make to have the association work correctly?

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>

感谢

推荐答案

如果您希望公开外键ID,也有EF管理的关系,您可以使用外键关联,但这些都只能在EF 4.0可用

If you want to expose the foreign key ID and also have the EF manage the relationship, you can use Foreign Key Associations, but these are only available in EF 4.0