Pergunta

Eu tenho a seguinte classe:

public class Application
{
    public int Id { get; set; }

    /* Other properties */

    public int LegacyId { get; set; }
    public int LegacyParentId { get; set; }

    public int? ApplicationSupersessionId { get; set; }
    public virtual ICollection<Application> ApplicationSupersessions { get; set; }

    public Application()
    {
        ApplicationSupersessions = new List<Application>();
    }
}

Onde ApplicationSupersessions é uma entidade auto-ingressada opcional.Já tenho dados adicionados ao meu Applications tabela e estou tentando ajustar os dados, que atualmente estão assim:

enter image description here

Mas eu preciso de aplicativos 5413 e 5414 ter um ApplicationSupersessionId de 5415 já que é assim que parece em nosso sistema Legacy, por isso adicionei os 2 Legacy colunas

Então eu tentei o seguinte:

var applications = CatalogueContext.Applications.ToList();

foreach (var application in applications)
{
    var legacyChildren = applications.Where(x => 
        x.LegacyParentId == application.LegacyId).ToList();

    if(legacyChildren.Any())
    {
        foreach(var child in legacyChildren)
        {
            application.ApplicationSupersessions.Add(child);
        }

       CatalogueContext.Entry(application).State = EntityState.Modified;
    }
}

CatalogueContext.SaveChanges();

Mas recebo o seguinte erro na linha CatalogueContext.Entry(application).State = EntityState.Modified;:

enter image description here

Foi útil?

Solução

Eu consegui resolver isso.Eu tive o relacionamento configurado errado na minha configuração.

Eu tive isso:

HasOptional(x => x.ApplicationSupersessions)
    .WithMany()
    .HasForeignKey(x => x.ApplicationSupersessionId)
    .WillCascadeOnDelete(false);

Quando deveria ter sido assim:

HasMany(x => x.ApplicationSupersessions)
    .WithOptional()
    .HasForeignKey(x => x.ApplicationSupersessionId)
    .WillCascadeOnDelete(false);

Não tenho certeza de qual é a diferença e se é ou não um bug do EF.

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