0
votes

Dynamics 365 (CRM) Version 9.1 Erreur de code C # en ligne: L'ID d'entité doit être identique à la valeur définie dans le sac de propriété

Lors du clonage / Copie des enregistrements d'enfants, j'utilise une boucle de Foreach, puis créez un enregistrement avec tous ses attributs. J'ai écrit un code similaire dans un autre projet et j'ai travaillé bien pour moi.

Il existe plusieurs articles / questions basées sur la même erreur. Maintenant, mon problème est de savoir comment devrais-je créer des enregistrements enfants avec tous ses attributs. P> xxx pré>

Un autre problème étrange p>

Une entrée avec la même clé existe déjà p> blockquote>

code: p> xxx pré>

même si je crée un nouvel objet et copier parentéentité code> comme ci-dessous, je reçois cette erreur.

Entity costcalEntity = new Entity();
costcalEntity.LogicalName = parentEntity.LogicalName;
costcalEntity["name"] = parentQuotationEntity.GetAttributeValue<string>("name");
costcalEntity.Id = Guid.Empty;
Guid newGuid = orgService.Create(costcalEntity);
if (newGuid != Guid.Empty)
{
    costcalEntity = parentEntity;
    costcalEntity.Id = newGuid;
    orgService.Update(costcalEntity);
}


0 commentaires

3 Réponses :


1
votes

Dans les deux cas, vous avez le même problème, avec la cause première de la cause de l'ID stockée dans la collection d'attributs de l'entité. Si vous regardez la génération de la liaison précoce, vous pouvez accéder à l'ID par l'entité.Id Propriété, ainsi que la collection d'attributs, comme indiqué dans la définition de l'ID dans l'ID principal:

public System.Nullable<System.Guid> AccountId
{
    [System.Diagnostics.DebuggerNonUserCode()]
    get
    {
        return this.GetAttributeValue<System.Nullable<System.Guid>>("accountid");
    }
    [System.Diagnostics.DebuggerNonUserCode()]
    set
    {
        this.OnPropertyChanging("AccountId");
        this.SetAttributeValue("accountid", value);
        if (value.HasValue)
        {
            base.Id = value.Value;
        }
        else
        {
            base.Id = System.Guid.Empty;
        }
        this.OnPropertyChanged("AccountId");
    }
}


3 commentaires

Eh bien, j'ai effacé l'identifiant dans les deux endroits. Comme mentionné, j'avais presque le même code pour un autre projet et a fonctionné bien. Mais j'ai découvert que plutôt que d'attribuer une entité récupérée directement à un nouvel objet d'entité, il suffit d'ajouter son attribut, puis non oublier de supprimer l'identifiant principal tel qu'il sera créé par CRM.


Dans vos exemples, vous ne vous indiquez pas l'identification de l'identifiant dans la collection Attributs.


Oui, je n'ai pas mentionné dans ma première pièce de code. Vient de mettre à jour mon code.



0
votes

Voici comment j'ai résolu

Entity parentEntity = orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); 

   Entity newParentEntity = new Entity()
                        {
                            LogicalName = parentEntity.LogicalName,
                        };
newParentEntity.Attributes.AddRange(parentEntity.Attributes); 
 newParentEntity.Attributes.Remove("primaryGuid");
orgService.Create(newParentEntity);


0 commentaires

0
votes

Si votre question est "Comment dupliquer une entité récupérée de CRM?", votre réponse peut être simplifiée.

var entity = orgService.Retrieve(context.PrimaryEntityName, context.PrimaryEntityId, new ColumnSet(true)); 
entity.Id = Guid.Empty;
entity.Attributes.Remove("primaryGuid");
orgService.Create(entity);


3 commentaires

C'étaient mes quatre premières lignes de codes pour la copie enregistrée, comme mentionné le même code travaillée avec une autre env, mais pour celui que je répète le code m'a donné, Une entrée avec la même clé existe déjà et donc j'ai essayé peu d'autres moyens, tels que la création d'entité, avec le nom principal, puis mettez à jour cet enregistrement avec un objet d'enregistrement parent. Histoire longue abrégée Cela ne fonctionne pas dans le scénario actuel, mais le code n'a aucun problème à exécuter une autre instance.


@Kankuer, je suppose que je suis confus sur les «quatre premières lignes de codes pour la copie des archives» parlez-vous de votre réponse? Parce que non où dans la question, supprimez-vous l'identifiant de la collection Attributs, juste l'état / statut.


Désolé pour la confusion, je voulais dire quand j'ai commencé à écrire un plugin, au-dessus de quatre lignes était mon point de départ et j'espérais que cela résoudrait le but, mais ce n'est pas le cas. Comme indiqué dans ma réponse et ma question à l'aide de la même entité d'entité et de supprimer son identifiant renvoyé une entrée avec la même clé existe déjà