objeto com a mesma chave já existe objectstatemanager
-
22-12-2019 - |
Pergunta
Eu estou tendo uma entidade que detém o acervo virtual de outra entidade.Quando tento inserir os dados preenchendo o acervo virtual para o recém-inserido objetos que ele está jogando o erro de objeto com a mesma chave já existe.
Eu sei que quando a entidade não é criado, ele vai ter de identidade do campo com o valor 0.Mas eu preciso armazenar o conjunto de dados quando eu armazenar os dados na tabela principal.
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
entityDbSet.Attach(entity);
dataContext.SyncObjectState(entity);
}
Este é o método insert que eu estou usando.e abaixo está o poco classes (implementação parcial para estender as classes para realizar a coleta de dados) para esta operação.
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; }
}
Eu estou passando os dados usando json.Que é também parece correto.como o acervo virtual de dados é adicionado à entidade corretamente.
{"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 me ajude a resolver este problema.
Nota :Apenas para resolver esta mesma chave exceção se eu tentar atribuir o campo de identidade a minha auto-ele está jogando a integridade referencial exceção.Eu sei que armazenar o realative coleção deve funcionar bem.mas ele não está funcionando para mim.por favor me dê alguma orientação e solução para isso.
Obrigado, sachin
Solução
Attach
é para fixar as entidades existentes.
O contexto deve atribuir adequada próprio estado, não há necessidade de fazê-lo manualmente no seu caso
public virtual void Insert(TEntity entity)
{
//((IObjectState)entity).ObjectState = ObjectState.Added;
context.TEntityDbSet.Add(entity);//Add, not Attach!
//dataContext.SyncObjectState(entity);
context.SaveChanges()
}
Outras dicas
Hi Obrigado a todos por ajudar.Eu mudei a maneira de executar esta operação.Eu criei o procedimento armazenado que aceita a principal entidade e do usuário tabela definida pelo tipo de criança coleção que pode ser passado como conjunto de dados .net página.E isso funciona bem para mim.
obrigado.