Pregunta

Estoy teniendo una entidad que mantiene la colección virtual de otra entidad. Cuando intento insertar los datos llenando la colección virtual para los objetos recién insertados, está lanzando el error que ya existe el objeto con la misma llave.

Sé que cuando la entidad no se crea, tendrá un campo de identidad con 0 valor. Pero necesito almacenar la colección de datos cuando almacene los datos en la tabla principal.

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

Este es el método de inserción que estoy usando. y a continuación se encuentran las clases de POCO (implementación parcial para extender las clases para mantener la recopilación de datos) para esta operación.

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; }               
}

Estoy pasando los datos usando JSON. Que también parece correcto. Como la recopilación virtual de datos se agrega a la entidad correctamente.

{"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"}]}}

Por favor, ayúdame a resolver este problema.

NOTA: Solo para resolver esta misma excepción clave si trato de asignar el campo de identidad, mi mismo está lanzando una excepción de integridad referencial. Sé que almacenar la colección real debería funcionar bien. Pero no está funcionando para mí. Por favor, dame alguna guía y solución para esto.

gracias, sachin

¿Fue útil?

Solución

Attach es para adjuntar entidades existentes.

El contexto debe asignar el propio estado adecuado, no hay necesidad de hacerlo manualmente en su caso

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

Otros consejos

Hola gracias a todos por ayudar.Cambié la forma de realizar esta operación.He creado el procedimiento almacenado que acepta la entidad principal y la tabla definida por el usuario de la colección infantil que se puede pasar como conjunto de datos desde .NET PAGE.Y esto funciona bien para mí.

gracias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top