Cadre d'entité:Erreur d'auto-adhésion
-
21-12-2019 - |
Question
J'ai la classe suivante :
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>();
}
}
Où ApplicationSupersessions
est une entité facultative auto-jointe.J'ai déjà des données ajoutées à mon Applications
tableau et j'essaie d'ajuster les données, qui ressemblent actuellement à ceci :
Mais j'ai besoin d'applications 5413
et 5414
avoir un ApplicationSupersessionId
de 5415
car c'est à cela que cela ressemble dans notre système Legacy, c'est pourquoi j'ai ajouté les 2 Legacy
Colonnes
J'ai donc essayé ce qui suit :
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();
Mais j'obtiens l'erreur suivante sur la ligne CatalogueContext.Entry(application).State = EntityState.Modified;
:
La solution
J'ai réussi à résoudre ce problème.J'ai mal configuré la relation dans ma configuration.
J'ai eu ça :
HasOptional(x => x.ApplicationSupersessions)
.WithMany()
.HasForeignKey(x => x.ApplicationSupersessionId)
.WillCascadeOnDelete(false);
Quand ça aurait dû être ça :
HasMany(x => x.ApplicationSupersessions)
.WithOptional()
.HasForeignKey(x => x.ApplicationSupersessionId)
.WillCascadeOnDelete(false);
Je ne sais pas quelle est la différence et s'il s'agit ou non d'un bug EF ?