Question

J'ai une entité qui détient la collection virtuelle d'une autre entité.Lorsque j'essaie d'insérer les données en remplissant la collection virtuelle pour les objets nouvellement insérés, l'erreur indique qu'un objet avec la même clé existe déjà.

Je sais que lorsque l'entité n'est pas créée, elle aura un champ d'identité avec une valeur 0.Mais je dois stocker la collection de données lorsque je stocke les données dans la table principale.

public virtual void Insert(TEntity entity)
    {
        ((IObjectState)entity).ObjectState = ObjectState.Added;
        entityDbSet.Attach(entity);
        dataContext.SyncObjectState(entity);
    }

C'est la méthode d'insertion que j'utilise.et ci-dessous se trouvent les classes poco (implémentation partielle pour étendre les classes afin de contenir la collection de données) pour cette opération.

public partial class UserDefinedData
{
    public int ID { get { return this.UserSelectedDValueID; } set { this.UserSelectedDValueID = value; } }
    public string Name { get { return this.entityTypeName; } }

    public virtual AM_AssetLocations AM_AssetLocations { get; set; }
}

public partial class AM_AssetLocations
{
    // Reverse navigation
    public virtual ICollection<UserDefinedData> UserDefinedDatas { get; set; }               
}

Je transmets les données en utilisant json.Ce qui semble également correct.car la collection virtuelle de données est ajoutée correctement à l’entité.

{"entity":{"ID":"0","CreatedByID":"0","CreatedDate":"04-13-2014 10:48","ModifiedByID":"","ModifiedDate":"","DeletedByID":"","DeletedDate":"","Deleted":"false","Name":"h","Active":"true","DisplayOrder":"0","Test Decimal":"10","":"","Test Number":"10","Test Plain Text":"h","Test RTF":"<p>hsj</p>","Test Yes No":"false","Test Yes No 2":"true","TestDate":"01-Apr-2014","TestDateTime":"10:00 AM","UserDefinedDatas":[{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"123","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"124","ValueListItemID":"25"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"122","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"117","ValueString":"h"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"119","ValueString":"<p>hsj</p>"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"125","ValueYesNo":0},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"126","ValueYesNo":1},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"120","ValueDate":"01-Apr-2014"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"121","ValueDate":"08-Apr-2014 10:00 AM"}]}}

S'il vous plaît, aidez-moi à résoudre ce problème.

Note :Juste pour résoudre cette même exception clé, si j'essaie d'attribuer moi-même le champ d'identité, cela lève une exception d'intégrité référentielle.Je sais que le stockage de la collection réelle devrait fonctionner correctement.mais ça ne marche pas pour moi.s'il vous plaît, donnez-moi des conseils et une solution pour cela.

Merci, Sachin

Était-ce utile?

La solution

Attach sert à attacher des entités existantes.

Le contexte doit lui-même attribuer l'état approprié, il n'est pas nécessaire de le faire manuellement dans votre cas

public virtual void Insert(TEntity entity)
{
    //((IObjectState)entity).ObjectState = ObjectState.Added;
    context.TEntityDbSet.Add(entity);//Add, not Attach!
    //dataContext.SyncObjectState(entity);
    context.SaveChanges()
}

.. http://msdn.microsoft.com/en-us/data/jj592676.aspx

Autres conseils

Bonjour merci tout d'avoir aidé.J'ai changé le moyen d'effectuer cette opération.J'ai créé la procédure stockée qui accepte l'entité principale et le type de table défini par l'utilisateur de la collection enfant pouvant être transmis en tant que jeu de données de la page .NET.Et cela fonctionne bien pour moi.

merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top