Estrutura de entidade:Erro de auto-adesão
-
21-12-2019 - |
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:
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;
:
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.