2 votes

Entity Framework + Repository Pattern et la mise à jour de la clé étrangère ne met pas à jour l'entité liée.

J'utilise Entity Framework 5 et le modèle UnitOfWork + Repository.

J'essaie de créer l'entité suivante :

public partial class ViaggioAttivita
{
    public System.Guid Id { get; set; }
    public System.Guid IdViaggio { get; set; }
    public virtual Viaggio Viaggio { get; set; }
}

public partial class Viaggio
{
    public System.Guid Id { get; set; }
    public virtual ICollection<ViaggioAttivita> ViaggiAttivita { get; set; }
}

J'ai remarqué que lorsque je crée la nouvelle entité ViaggioAttivita qui remplit l'IdViaggio, lorsque je fais le calcul suivant

ViaggioAttivita attivita = new ViaggioAttivita();
attivita.IdViaggio = ParentId;
unitOfWork.ViaggiAttivitaRepository.Insert(attivita);

le bien de navigation attivita.Viaggio n'est pas mis à jour.

Si je mets directement à jour l'attivita.Viaggio au lieu de l'Id

ViaggioAttivita attivita = new ViaggioAttivita();
attivita.Viaggio = unitOfWork.ViaggiRepository.GetByID(ParentId);
unitOfWork.ViaggiAttivitaRepository.Insert(attivita);

Le Viaggio est bien sûr mis à jour, mais la clé IdViaggio l'est aussi.

Qu'est-ce que je rate ?

Pourquoi cette différence ?

J'ai essayé d'appeler un .Save() mais rien ne change.

Il semble que les relations ne soient mises à jour que si je mets manuellement à jour l'entité, mais qu'elles ne soient pas mises à jour si je ne mets à jour que la clé.

Merci.

Edit 1 :

Je suis sur Sql Server 2008, MVC3, Entity Framework 5 (runtime v4.0.30319 bien sûr). Mode Database First. Les deux tables ont la relation (bien sûr, sinon la clé ne serait pas remplie en utilisant la deuxième méthode).

Edit 2 :

J'essaie d'apporter des informations sur EDMX ;

<EntityType Name="Viaggio">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Guid" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <NavigationProperty Name="ViaggiAttivita" Relationship="DatabaseModel.FK_ViaggiAttivita_Viaggi" FromRole="Viaggi" ToRole="ViaggiAttivita" />
  </EntityType>

  <EntityType Name="ViaggioAttivita">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Guid" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Name="IdViaggio" Type="Guid" Nullable="false" />
    <NavigationProperty Name="Viaggio" Relationship="DatabaseModel.FK_ViaggiAttivita_Viaggi" FromRole="ViaggiAttivita" ToRole="Viaggi" />
  </EntityType>

 <AssociationSet Name="FK_ViaggiAttivita_Viaggi" Association="DatabaseModel.FK_ViaggiAttivita_Viaggi">
      <End Role="Viaggi" EntitySet="Viaggi" />
      <End Role="ViaggiAttivita" EntitySet="ViaggiAttivita" />
    </AssociationSet>

0voto

phil soady Points 4463

La différence est :

a) Définir Clé étrangère seulement. (Id) Si cette entité est chargée dans le cache, la propriété Navigation peut être définie. Si elle n'est pas chargée, il faut alors déclencher le chargement. Vous pouvez rechercher comment ou quand cela est fait automatiquement. Voir la rubrique chargement paresseux versus .include

b) Définir la propriété de navigation avec une entité. la propriété de navigation est prise en charge par le champ Id de la clé étrangère. Maintenant EF peut voir la propriété Nav et sa clé. Il peut définir l'ID avec les données qu'il possède déjà. Il n'est pas nécessaire de charger la base de données. C'est donc réglé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X