Uma propriedade dependente em um ReferentialConstraint é mapeada para uma coluna gerada pela loja

Eu recebo esse erro ao gravar no database:

Uma propriedade dependente em um ReferentialConstraint é mapeada para uma coluna gerada pelo armazenamento. Coluna: ‘PaymentId’.

public bool PayForItem(int terminalId, double paymentAmount, eNums.MasterCategoryEnum mastercategoryEnum, int CategoryId, int CategoryItemId) { using (var dbEntities = new DatabaseAccess.Schema.EntityModel()) { int pinnumber = 0; long pinid = 1; //getPinId(terminalId,ref pinnumber) ; var payment = new DatabaseAccess.Schema.Payment(); payment.CategoryId = CategoryId; payment.ItemCategoryId = CategoryItemId; payment.PaymentAmount = (decimal)paymentAmount; payment.TerminalId = terminalId; payment.PinId = pinid; payment.HSBCResponseCode = ""; payment.DateActivated = DateTime.Now; payment.PaymentString = "Payment"; payment.PromotionalOfferId = 1; payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid; //payment.PaymentId = 1; dbEntities.AddToPayments(payment); dbEntities.SaveChanges(); } return true; } 

O esquema é:

insira a descrição da imagem aqui

É possível que você tenha definido uma relação de coluna ruim entre suas tabelas? colunas diferentes e uma foi definida como autonumeric.

Isso aconteceu comigo.

Este erro diz que você está usando uma relação não suportada ou você tem um erro no seu mapeamento. Seu código provavelmente não está relacionado ao erro.

O erro significa que você tem alguma relação entre entidades em que a propriedade de chave estrangeira na entidade dependente é definida como gerada pela loja. As propriedades geradas na loja são preenchidas no database. O EF não suporta propriedades geradas pela loja como foreign keys (assim como propriedades calculadas em chaves primárias).

Eu tive o mesmo problema. Com base nas respostas fornecidas aqui, consegui rastreá-lo e resolvê-lo, mas tive um problema estranho descrito abaixo – pode ajudar alguém no futuro.

Nas minhas tabelas dependentes, as colunas Chave estrangeira foram configuradas para StoreGeneratedPattern = “Identity”. Eu tive que mudar para “None”. Infelizmente, fazê-lo dentro do designer não funcionou.

Eu olhei no XML gerado pelo designer (SSDL) e essas propriedades ainda estavam lá, então eu as removi manualmente. Eu também tive que corrigir as colunas no database (remova o Identity (1,1) do CREATE TABLE SQL)

Depois disso, o problema desapareceu.

Eu tive o mesmo problema e depois de alguma escavação no design de tabela no SQL Server, descobri que por engano eu definir chave primária da tabela também como chave estrangeira.

fluxo de design da tabela do servidor sql

Nesta imagem você pode ver que JobID é a chave primária da tabela mas também equivocadamente a chave estrangeira.

Se você verificou seus relacionamentos e está bem lá.

Exclua a tabela no edmx e atualize a partir do database. Isto irá poupar você fazendo a atualização manualmente.

Para mim, foi uma chave estrangeira mal colocada na mesa, mas mesmo depois de alterar a mesa para consertá-la, ela ainda não estava funcionando. Você precisa atualizar os arquivos EDMX (e não o suficiente para “atualizar” a tabela do modelo, você precisa remover e adicionar a tabela novamente no modelo).

Verifique novamente a relação entre Pagamento e as outras tabelas / entidades. Incluindo os que não devem conter o PaymentId porque é onde o problema provavelmente está se escondendo.

Ao criar foreign keys no SQL Server Management Studio, a chave primária é padronizada e esse padrão é revertido quando a tabela pai é alterada. Portanto, tenha cuidado para alterar os valores na ordem correta na janela “Tabelas e colunas”.

Além disso, depois de corrigir o relacionamento problemático, há uma boa chance de que uma simples “Refresh” no modelo não remova corretamente o relacionamento errôneo do modelo e você obterá o mesmo erro mesmo após a ” correção “, por isso faça você mesmo no modelo antes de executar uma atualização. (Descobri isso da maneira mais difícil.)

Além da resposta aceita, se você estiver usando o gerador EF POCO reverso ou alguma outra ferramenta que gere seus POCO’s, certifique-se de regenerá- los!

No meu caso, o problema foi causado por ter uma relação 1-1 bidirecional:

 class Foo{ [Key] Id [ForeignKey] BarId ... } class Bar{ [Key] Id [ForeignKey] FooId ... } 

Eu tive que simplesmente remover uma das duas foreign keys (não é necessário de qualquer maneira).

No meu caso, foi simplesmente que eu não tinha permissions definidas corretamente no database. Eu tinha lido apenas set e estrutura de entidade estava me dando um erro ReferentialConstraint que me jogou fora. Adicionado permissions de gravação adicionais e tudo estava bem.

No meu caso, eu tinha uma propriedade Database Generated e uma propriedade de navegação ForeignKey configurada para fazer referência a uma tabela relacionada de 1 para 1.

Isso não era algo que eu pudesse remover, precisava ser capaz de definir a chave primária da entidade como Database Generated E eu precisava poder referenciar a tabela 1 para 1 como uma propriedade de navegação.

Não tenho certeza se isso é o mesmo para os outros, mas esse problema só estava aparecendo ao criar uma nova entidade, ler ou editar entidades existentes não exibia o problema, então resolvi o problema criando uma versão herdada do meu Contexto e usando o método Fluente para desativar a propriedade de navegação durante a criação.

Então, minha entidade original ficou assim:

 public partial class MyEntity { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid id{ get; set; } // Navigation [ForeignKey("id")] public PathEntity Path { get; set; } } 

Então criei um contexto herdado especial que se parecia com isso:

  private class _navPropInhibitingContext : EF.ApplicationDBContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .Ignore(e => e.Path); } } 

e, em seguida, alterou o código que criou a nova entidade para tornar o usuário do novo tipo de contexto

  using (var specialContext = new _navPropInhibitingContext()) { var dbModel = new MyEntity() { ... }; specialContext.MyEntity.Add(dbModel); await specialContext.SaveChangesAsync(); } 

Espero que isso ajude alguém