代码之家  ›  专栏  ›  技术社区  ›  Orion Adrian

在实体框架中创建递归实体的正确方法是什么?

  •  3
  • Orion Adrian  · 技术社区  · 15 年前

    我目前正在使用VS2010RC,并试图创建一个包含递归自引用实体的模型。当前,当我从模型中导入实体时,会收到一个错误,指示父属性不能作为关联的一部分,因为它被设置为“Computed”或“Identity”,尽管我不确定它为什么这样做。我一直在手工编辑这个文件以避免这个错误,但是这个模型根本不起作用。

    让递归实体在实体框架中工作的正确方法是什么。

    默认情况下导入的模型不起作用。我试过几次调整,每次都会出现不同类型的错误。在这一点上,我正在寻找一个解决方案,并解释为什么该解决方案是正确的。

    相关数据库对象

    CREATE TABLE [dbo].[Appointments](
        [AppointmentId] [int] IDENTITY(1,1) NOT NULL,
        [Description] [nvarchar](1024) NULL,
        [Start] [datetime] NOT NULL,
        [End] [datetime] NOT NULL,
        [Username] [varchar](50) NOT NULL,
        [RecurrenceRule] [nvarchar](1024) NULL,
        [RecurrenceState] [varchar](20) NULL,
        [RecurrenceParentId] [int] NULL,
        [Annotations] [nvarchar](50) NULL,
        [Application] [nvarchar](100) NOT NULL,
        CONSTRAINT [PK_Appointments] PRIMARY KEY CLUSTERED 
        (
            [AppointmentId] ASC
        )
    )
    GO
    
    ALTER TABLE [dbo].[Appointments]  WITH CHECK ADD  CONSTRAINT [FK_Appointments_ParentAppointments] FOREIGN KEY([RecurrenceParentId])
    REFERENCES [dbo].[Appointments] ([AppointmentId])
    GO
    
    ALTER TABLE [dbo].[Appointments] CHECK CONSTRAINT [FK_Appointments_ParentAppointments]
    GO
    EDMX
    

    --

    <Schema Namespace="SafetyTrackerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
        <EntityContainer Name="SafetyTrackerModelStoreContainer">
          <EntitySet Name="Appointments" EntityType="SafetyTrackerModel.Store.Appointments" store:Type="Tables" Schema="dbo" />
          <AssociationSet Name="FK_Appointments_ParentAppointments" Association="SafetyTrackerModel.Store.FK_Appointments_ParentAppointments">
            <End Role="Appointments" EntitySet="Appointments" />
            <End Role="Appointments1" EntitySet="Appointments" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Appointments">
          <Key>
            <PropertyRef Name="AppointmentId" />
          </Key>
          <Property Name="AppointmentId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
          <Property Name="Description" Type="nvarchar" MaxLength="1024" />
          <Property Name="Start" Type="datetime" Nullable="false" />
          <Property Name="End" Type="datetime" Nullable="false" />
          <Property Name="Username" Type="varchar" Nullable="false" MaxLength="50" />
          <Property Name="RecurrenceRule" Type="nvarchar" MaxLength="1024" />
          <Property Name="RecurrenceState" Type="varchar" MaxLength="20" />
          <Property Name="RecurrenceParentId" Type="int" StoreGeneratedPattern="Identity" />
          <Property Name="Annotations" Type="nvarchar" MaxLength="50" />
          <Property Name="Application" Type="nvarchar" Nullable="false" MaxLength="100" />
        </EntityType>
        <Association Name="FK_Appointments_ParentAppointments">
          <End Role="Appointments" Type="SafetyTrackerModel.Store.Appointments" Multiplicity="0..1" />
          <End Role="Appointments1" Type="SafetyTrackerModel.Store.Appointments" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Appointments">
              <PropertyRef Name="AppointmentId" />
            </Principal>
            <Dependent Role="Appointments1">
              <PropertyRef Name="RecurrenceParentId" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema></edmx:StorageModels>
    <edmx:ConceptualModels>
      <Schema Namespace="SafetyTrackerModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
        <EntityContainer Name="SafetyTrackerEntities">
          <EntitySet Name="Appointments" EntityType="SafetyTrackerModel.Appointment" />
          <AssociationSet Name="FK_Appointments_ParentAppointments" Association="SafetyTrackerModel.FK_Appointments_ParentAppointments">
            <End EntitySet="Appointments" Role="Appointment" />
            <End EntitySet="Appointments" Role="Appointment1" />
          </AssociationSet>
          </EntityContainer>
        <EntityType Name="Appointment">
          <Key>
            <PropertyRef Name="AppointmentId" />
          </Key>
          <Property xmlns:a="http://schemas.microsoft.com/ado/2009/02/edm/annotation" Name="AppointmentId" Nullable="false" a:StoreGeneratedPattern="Identity" Type="Int32" />
          <Property Name="Description" MaxLength="1024" FixedLength="false" Unicode="true" Type="String" />
          <Property Name="Start" Nullable="false" Type="DateTime" />
          <Property Name="End" Nullable="false" Type="DateTime" />
          <Property Name="Username" Nullable="false" MaxLength="50" FixedLength="false" Unicode="false" Type="String" />
          <Property Name="RecurrenceRule" MaxLength="1024" FixedLength="false" Unicode="true" Type="String" />
          <Property Name="RecurrenceState" MaxLength="20" FixedLength="false" Unicode="false" Type="String" />
          <Property Name="Annotations" MaxLength="50" FixedLength="false" Unicode="true" Type="String" />
          <Property Name="Application" Nullable="false" MaxLength="100" FixedLength="false" Unicode="true" Type="String" />
          <NavigationProperty Name="ChildAppointments" Relationship="SafetyTrackerModel.FK_Appointments_ParentAppointments" FromRole="Appointment" ToRole="Appointment1" />
          <NavigationProperty Name="ParentAppointment" Relationship="SafetyTrackerModel.FK_Appointments_ParentAppointments" FromRole="Appointment1" ToRole="Appointment" />
        </EntityType>
        </Schema>
    </edmx:ConceptualModels>
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
        <EntityContainerMapping StorageEntityContainer="SafetyTrackerModelStoreContainer" CdmEntityContainer="SafetyTrackerEntities">
          <EntitySetMapping Name="Appointments">
            <EntityTypeMapping TypeName="SafetyTrackerModel.Appointment">
              <MappingFragment StoreEntitySet="Appointments"> <!-- [1] -->
                <ScalarProperty Name="Application" ColumnName="Application" />
                <ScalarProperty Name="Annotations" ColumnName="Annotations" />
                <ScalarProperty Name="RecurrenceState" ColumnName="RecurrenceState" />
                <ScalarProperty Name="RecurrenceRule" ColumnName="RecurrenceRule" />
                <ScalarProperty Name="Username" ColumnName="Username" />
                <ScalarProperty Name="End" ColumnName="End" />
                <ScalarProperty Name="Start" ColumnName="Start" />
                <ScalarProperty Name="Description" ColumnName="Description" />
                <ScalarProperty Name="AppointmentId" ColumnName="AppointmentId" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          <AssociationSetMapping Name="FK_Appointments_ParentAppointments" TypeName="SafetyTrackerModel.FK_Appointments_ParentAppointments" StoreEntitySet="Appointments">
            <EndProperty Name="Appointment1">
              <ScalarProperty Name="AppointmentId" ColumnName="AppointmentId" />
            </EndProperty>
            <EndProperty Name="Appointment">
              <ScalarProperty Name="AppointmentId" ColumnName="RecurrenceParentId" />
            </EndProperty>
            <Condition ColumnName="AppointmentId" IsNull="false" /> <!-- Problem Here -->
          </AssociationSetMapping>
          </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
    

    我得到编译器错误:

    无法为列成员“AppointmentId”指定条件,因为它被标记为“Computed”或“Identity”StoreGeneratedPattern。

    如果删除该错误,则该错误消失,但只需介绍另一个错误:

    从第3350、3380行开始映射片段时出现问题:EntityTypes SafetyTrackerModel。约会正映射到表约会中的同一行。映射条件可用于区分这些类型映射到的行。

    恰好是标着[1]的那一行。

    在这一点上,我不知道该怎么做。我尝试了很多很多事情,最终我用尽了智慧去尝试,进入了货运邪教的土地。

    我真的很想知道这里有什么问题。

    1 回复  |  直到 15 年前
        1
  •  1
  •   LaGrandMere Suresh Chaudhary    14 年前

    EF可以支持递归对象。 您只需导入模型,EF将获取关系并允许您进行递归。

    MSDN .

    关于你的FK,我不明白你为什么有支票限制。 添加FK应如下所示:

    ALTER TABLE Appointments
    ADD FOREIGN KEY (RecurrenceParentId) REFERENCES Appointments(AppointmentId);
    

    也许你的FK创作出了问题,而EF无法处理?

    希望这有帮助!

    编辑:哈哈,9个月前刚看到有人问。。。好吧,没关系:)