2010-03-09 6 views
3

J'utilise actuellement VS 2010 RC, et j'essaye de créer un modèle qui contient une entité auto-référencée récursive. Actuellement, lorsque j'importe l'entité à partir du modèle, j'obtiens une erreur indiquant que la propriété parent ne peut pas faire partie de l'association car elle est définie sur 'Computed' ou 'Identity', bien que je ne sache pas pourquoi elle le fait. J'ai modifié le fichier manuellement pour contourner cette erreur, mais le modèle ne fonctionne tout simplement pas.Quelle est la méthode appropriée pour créer une entité récursive dans Entity Framework?

Quelle est la méthode appropriée pour que les entités récursives fonctionnent dans Entity Framework.

Le modèle importé par défaut ne fonctionne pas. J'ai essayé plusieurs réglages et j'ai fini par avoir un type d'erreur différent à chaque fois. À ce stade, je cherche une solution et une explication de la raison pour laquelle la solution est correcte.

pertinentes Base de données objet

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> 

Comme il est je reçois l'erreur du compilateur:

Etat ne peut pas être spécifié pour les membres de la colonne 'AppointmentId' parce qu'elle est marquée par un StoreGeneratedPattern 'Computed' ou 'Identity'.

Si supprimé cette erreur disparaît, mais présente simplement un autre sur:

problème des fragments de cartographie à partir de lignes 3350, 3380: EntityTypes SafetyTrackerModel.Appointment sont cartographiés aux mêmes lignes de rendez-vous de table. Les conditions de mappage peuvent être utilisées pour distinguer les lignes auxquelles ces types sont mappés.

qui se trouve être la ligne ci-dessus marquée [1]. À ce stade, je suis perdu quant à ce que je suis censé faire. J'ai essayé beaucoup, beaucoup de choses et finalement je suis à court de choses intelligentes pour essayer d'entrer dans le pays du culte de la cargaison. Je voudrais vraiment comprendre quel est le problème ici.

+0

Huh? Pourquoi le parent est-il calculé ou identifié? Je suppose que ce devrait être un FK à la même table. Pouvez-vous montrer vos métadonnées DB? En outre, considérez le modèle de jeux imbriqués. –

+1

Pourriez-vous nous donner la définition de la table SQL? J'ai des entités autoréférencées et je n'ai pas de tels problèmes. – LukLed

+0

Définition de la table SQL ajoutée. –

Répondre

1

EF peut prendre en charge des objets récursifs. Il vous suffit d'importer le modèle et EF va prendre la relation et vous permettra de faire la récursivité.

Voir MSDN.

À propos de votre FK, je ne comprends pas pourquoi vous avez une CONTRAINTE DE CONTRÔLE. Ajout d'un FK devrait ressembler à ceci:

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

Peut-être que quelque chose a mal tourné avec votre FK création et EF ne peut pas le manipuler?

Espérons que cela aide!

Modifier: haha, juste vu il a été demandé il y a 9 mois ... Eh bien, peu importe :)

Questions connexes