Pergunta

Como tenho que configurar uma propriedade para que, ao usar o SaveChanges, o relacionamento de muitos para um seja salvo e eu não recebo: Inserir a declaração conflitada com a restrição de chave estrangeira ... erro.

Muito simples, tenho um anúncio e um adtype onde há muitos anúncios em um adtype. Há uma propriedade no anúncio:

public class Ad
{
   public Int32 AdTypeId { get; set; }
   public virtual AdType AdType { get; set; }
}

Para cobrir esse relacionamento.

Quando eu faço isso:

someAd.AdType = someAdType;

A propriedade está bem definida, mas o adtypeid não está. Não se preocupe, já que eu presumiria que isso seria bom para salvar.

context.SaveChanges();

O problema é que, neste ponto, está tentando salvar o valor 0 na coluna Adtypeid (causando uma questão de chave estrangeira) em vez de usar a propriedade Adtype atribuída ao objeto para descobrir o que deve inserir na coluna Adtypeid.

Coisas que eu sei:

  • Neste ponto, o SomeadType é persistido/tem um ID.
  • A propriedade Adtype está definida corretamente.
  • O adtypeid é 0.
  • Existe um relacionamento de chave estrangeira no banco de dados.
  • Adtypeid é uma chave primária.
  • Eu adiei/preguiçoso carregando para true

Eu realmente não tentei mudar o adtype, pois ele está configurado para permitir carregamento preguiçoso.

Foi útil?

Solução

Ok, parece que estou usando a abordagem não proxiada (criada essa palavra ... YAH) "Rastreamento de alterações baseado em instantâneos", o sistema não tem uma ideia real de que mudou.

Neste exemplo, o cliente é do tipo poco puro. Diferentemente das entidades baseadas no EntityObject ou no iPoco, fazer alterações na entidade não mantém automaticamente o gerente de estado sincronizado porque não há notificação automática entre suas entidades pura pura e a estrutura da entidade. Portanto, ao consultar o gerente do estado, ele acha que o estado do objeto do cliente permanece inalterado, embora tenhamos feito uma mudança explicitamente em uma das propriedades da entidade.

Tenho isso daqui

Portanto, para garantir que ele saiba verificar se houve uma mudança, tenho que usar o AceptaLlChangesAfterSave opção com o método SaveChanges.

context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);

E funciona. Espero entender corretamente ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top