سؤال

لدي الصف التالي:

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>();
    }
}

أين ApplicationSupersessions هو كيان اختياري انضم ذاتيًا.لدي بيانات تمت إضافتها بالفعل إلى حسابي Applications الجدول وأحاول تعديل البيانات، والتي تبدو حاليًا كما يلي:

enter image description here

لكني بحاجة إلى التطبيقات 5413 و 5414 أن يكون لديك ApplicationSupersessionId ل 5415 لأن هذا هو ما يبدو عليه نظامنا القديم، ولهذا السبب أضفت 2 Legacy أعمدة

لذلك حاولت ما يلي:

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();

لكني أحصل على الخطأ التالي على السطر CatalogueContext.Entry(application).State = EntityState.Modified;:

enter image description here

هل كانت مفيدة؟

المحلول

تمكنت من حل هذا.لقد تم إعداد العلاقة بشكل خاطئ في التكوين الخاص بي.

كان لدي هذا:

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

عندما كان ينبغي أن يكون هذا:

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

لست متأكدًا من الفرق وما إذا كان خطأ EF أم لا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top